2011-07-06 79 views
5

在下面的代碼中,我試圖從Excel中插入記錄到數據庫表,但附加的列沒有通過必須填充的Excel傳遞具有從請求頁面分配的常量值(具有不同值的foreach循環)。如何使用ASP.Net插入一個常量值到列中SqlBulkCopy

string CONSTANTVALUE="Test"; 
bulkCopy.DestinationTableName = "TABLE NAME"; 
bulkCopy.ColumnMappings.Add("TABLECOLUMN1", "EXCELCOLUMN1"); 
bulkCopy.ColumnMappings.Add("TABLECOLUMN2", "EXCELCOLUMN2"); 
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", CONSTANTVALUE); 
bulkCopy.WriteToServer(dr); 

但是代碼不起作用。有任何想法嗎?

回答

4

我假設你的dr是某種類型的閱讀器。它是如何填充的?有可能在列中選擇一個默認值並映射到。像這樣的(SQL語法)的東西

select 
    EXCELCOLUMN1, 
    EXCELCOLUMN2, 
    'ConstantValueFromPage' as EXCELCUSTOM 
from 
    sheet1 

然後有:

bulkCopy.ColumnMappings.Add("TABLECOLUMN3", "EXCELCUSTOM"); 

HTH

+0

想象一下,默認值是一個非常長的字符串。在傳輸數據結構(Oracle或SqlServer驅動程序)和ADO.NET DataTable中,是否將冗餘每行重複出現的默認值優化爲例如? –

0

您是否嘗試在數據庫中爲您設置默認值?我認爲這是最簡單的方法,因爲在插入任何記錄之後,默認值也會插入到指定的列中(它就像觸發器一樣)。

+1

根據這個問題,我認爲每個請求的常數值可能會有所不同。你怎麼設置默認值? – suryakiran

+0

在這種情況下,我認爲在插入新記錄之前,您可以使用SMO(服務器管理對象,API在代碼中使用SQL Server)更改列的默認值。 –

4

你可以做到這一點,通過改變你的命令文本。如下

string CONSTANTVALUE="Test"; 
OleDbCommand command=new OleDbCommand("select *,"+CONSTANTVALUE+" as [ConstantCol] from [sheet$]",ObleDbCon); 
using (DbDataReader dr = command.ExecuteReader()) 
{ 
bulkCopy.DestinationTableName = "TABLE NAME"; 
bulkCopy.ColumnMappings.Add("TABLECOLUMN1", "EXCELCOLUMN1"); 
bulkCopy.ColumnMappings.Add("TABLECOLUMN2", "EXCELCOLUMN2"); 
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", "ConstantCol"); 
bulkCopy.WriteToServer(dr); 
} 
+0

這段代碼對我很好,但有兩點需要注意:1)ColumnMappings.Add的參數是(sourceColumn,destinationColumn)。所以如果你試圖從Excel複製到數據庫表,那麼參數應該顛倒,它應該是bulkCopy.ColumnMappings.Add(「EXCELCOLUMN1」,「TABLECOLUMN1」); 2)如果您要使用Excel的列名,那麼您的Excel連接字符串需要包含HDR = Yes。如果發現使用索引更容易,這樣我就不必依賴製作電子表格的人使用正確的標題名稱。謝謝! –

相關問題