我們正在升級15年前的代碼庫,需要創建一些本機BCP格式的數據文件。是否可以從C#創建SQL Server本機文件(如BCP本機格式)
在新系統中,我們理想地希望利用C#DataTable對象中的數據以本機BCP格式創建數據文件。
可以這樣做,如果是這樣,那麼最好的方法是什麼?
我們正在升級15年前的代碼庫,需要創建一些本機BCP格式的數據文件。是否可以從C#創建SQL Server本機文件(如BCP本機格式)
在新系統中,我們理想地希望利用C#DataTable對象中的數據以本機BCP格式創建數據文件。
可以這樣做,如果是這樣,那麼最好的方法是什麼?
不,不能這樣做,我們已經發現了創建本地BCP文件的唯一方法是通過使用SQL Server。如果有人發展或找到其他方式,請在此發佈!
您是否可以將數據表中的數據放入SQL Server上的暫存區域?如果是這樣,你可以產生一個BCP過程。
BCP:http://msdn.microsoft.com/en-us/library/aa174646%28SQL.80%29.aspx
例如,我使用:
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
開關:
編輯+新思路:
如果你有機會到填充DataTable中的查詢,你可以使用那些具有BCP或SQLDMO出口出原始格式文件。下面的查詢使用QUERYOUT開關,而不是OUT開關的,因爲它們含有內嵌從視圖查詢
出口特定的列:
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
出口特定列從JOIN:
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
有沒有辦法做到這一點與數據來自C#對象,而不是從數據庫? – alchemical 2009-11-27 22:25:56
如果它是那麼古老,那麼BCP部分可能看起來非常像一個Sybase BCP部分。在Sybase中,我會開始查看客戶端庫並使用BCP API提供代碼示例。用於相應API的CTLib和/或Java罐子。對於Microsoft,可能會有涉及BCP的本機C或Basic API的類似部分。您可能不需要API的通信部分,只需要逐個記錄地準備和讀取/寫入文件。
如果沒有這樣的事情,那麼我會考慮非本地格式手工製作FMT文件和文本類數據文件,生產/由原來的BCP計劃消耗。
還有就是要做到這一點類似的方式,但你必須引用SQLDMO,它會創建一個等效格式就像BCP。通過使用SQLDMO的BulkCopy對象,你可以做你正在尋找的東西。這裏是使用SQLDMO庫here在vbscript中完成的例程的鏈接。
希望這會有所幫助, 最好的問候, 湯姆。
他的數據在C#中的數據表中 - 它不在SQL Server中。 – 2009-11-28 13:43:05
假設您只修復了目標表中的列類型,沒有可爲空,沒有unicode字符串,並且願意處理字節序,那麼本機文件格式只是這些類型的字節。
我最近寫一個臨時文件逐字節,並使用BCP
從AC#腳本批量導入數據bcp destTable in model.raw -T -S _serverName -n
model.raw通過iscreated逐個字節:
fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;
foreach (var element in outputDimensions)
{
// fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
//Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
Utilities.fastCopy(profileid, fileBytes, offset);
offset += 4;
Utilities.fastCopy(element.index, fileBytes, offset);
offset += 4;
for (var i = 0; i < TimeSlices; i++, offset += 4)
{
float target = GetDataForTime(i,...);
Utilities.fastCopy(target, fileBytes, offset);
}
}
FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);
林好奇。爲什麼你需要Native格式文件中的數據? – 2009-11-27 22:30:05
下游系統堅持! – alchemical 2009-11-27 22:55:17