好的,我會盡我所能解釋這一點。我編寫了一個應用程序,它使用SQL表來定義一個固定寬度的數據源結構(所以,標題,開始索引,字段長度等)。當我的應用程序運行時,它會查詢此表並使用DataColumn對象創建一個DataTable對象(稱爲finalDT
),並保留ColumnName = header。然後,我在這個表中附加一組存在於我們使用的每個數據源中的DataColumn對象(我傾向於稱之爲派生列)。我還創建一個主鍵字段,它是一個自動遞增整數。最初,我推出了自己的解決方案來讀取固定寬度的文件,但我試圖將其轉換爲使用FileHelper。主要是,我正在考慮整合它,以便我可以訪問FileHelper可以解析的其他文件類型(CSV,Excel等)。使用FileHelpers.Dynamic,讀取一個固定寬度的文件並上傳到SQL
現在,我的問題。使用FileHelper.Dynamic,我能夠創建使用以下方法的FileHelperEngine對象:
private static FileHelperEngine GetFixedWidthFileClass(bool ignore)
{
singletonArguments sArgs = singletonArguments.sArgs;
singletonSQL sSQL = singletonSQL.sSQL;
List<string> remove = new List<string>();
FixedLengthClassBuilder flcb = new FixedLengthClassBuilder(sSQL.FixedDataDefinition.DataTableName);
flcb.IgnoreFirstLines = 1;
flcb.IgnoreLastLines = 1;
flcb.IgnoreEmptyLines = true;
foreach (var dcs in sSQL.FixedDataDefinition.Columns)
{
flcb.AddField(dcs.header, Convert.ToInt32(dcs.length), "String");
if (ignore && dcs.ignore)
{
flcb.LastField.FieldValueDiscarded = true; //If we want to ignore a column, this is how to do it. Would like to incorporate this.
flcb.LastField.Visibility = NetVisibility.Protected;
}
else
{
flcb.LastField.TrimMode = TrimMode.Both;
flcb.LastField.FieldNullValue = string.Empty;
}
}
return new FileHelperEngine(flcb.CreateRecordClass());
}
sSQL.FixedDataDefinition.Columns
是我怎樣存儲用於固定寬度的數據源文件中的字段定義。然後我通過執行生成的DataTable:
DataTable dt = engine.ReadFileAsDT(file);
其中file
是完整路徑到固定寬度的文件和engine
是我保持從上面示出的方法GetFixedWidthFileClass()
結果。好吧,現在我有一個沒有主鍵和派生列的DataTable。此外,dt
中的所有字段都標記爲ReadOnly = true
。這是事情變得混亂的地方。
我需要填充dt
到finalDT
,它需要沒有任何主鍵信息dt
沒問題。如果發生這種情況,我可以使用finalDT
將我的數據上傳到我的SQL表中。如果這不可能發生,那麼我需要一個finalDT
沒有主鍵,但仍然上傳到我的SQL表的方式。 SqlBulkCopy
會允許嗎?有另一種方法嗎?
在這一點上,我願意從頭開始,只要我可以使用FileHelper來解析固定寬度的文件,結果存儲到我的SQL表中,我只是沒有看到那裏的路徑。