2017-05-11 18 views
0

我試圖導入Excel工作表到SQL Server數據庫。發生的問題是列映射。 如果在Excel工作表的列名稱與句號結束(例如:「編號」,「名稱」),C#被拋出異常SqlBulkCopy映射問題與全列在列名

消息=給定的ColumnName「號」與數據源中的任何列 不匹配。

但是,如果我刪除了fullstop,它工作得很好。

在C#中映射的源代碼如下

 private void InsertExcelRecords() 
    { 
    string FilePath = "C:\\Upload\\" + FileUpload.FileName; 
    string fileExtension = Path.GetExtension(FileUpload.PostedFile.FileName); 
    FileUpload.SaveAs("C:\\Upload\\" + FileUpload.FileName); 

    ExcelConn(FilePath, fileExtension); 
    Econ.Open(); 
    DataTable dtExcelSheetName = Econ.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

    string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString(); 

    Query = string.Format("Select * FROM [{0}]", getExcelSheetName + "A7:I"); 

    OleDbCommand Ecom = new OleDbCommand(Query, Econ); 

    DataSet ds = new DataSet(); 
    OleDbDataAdapter oda = new OleDbDataAdapter(Query, Econ); 
    Econ.Close(); 
    oda.Fill(ds); 
    DataTable Exceldt = ds.Tables[0]; 
    connection(); 
    SqlBulkCopy objbulk = new SqlBulkCopy(con); 
    objbulk.DestinationTableName = "BankTransaction"; 
    objbulk.ColumnMappings.Add("No", "Number"); 
    con.Open(); 
    objbulk.WriteToServer(Exceldt); 
    con.Close(); 
} 

請讓我知道如果你需要任何更多的信息。

+0

錯誤是明確的,無關與Excel來代替你的代碼

objbulk.ColumnMappings.Add("No.", "Number") 

。你的映射表示在你的Exceldt中有一個名稱爲「No.」的列,它並不存在。你檢查了DataTable的列名嗎?如果它的工作沒有完整的停止,這意味着列名不*完全停止 –

+0

@PanagiotisKanavos,感謝您的快速響應,我的問題的意思是,Excel表中的列名稱也以fullstop結尾,然後這個錯誤即將到來。如果我手動重命名列名並從兩者(excel表格和列映射)中刪除全部停止,則會出錯。 –

+0

您正在使用DataTable,而不是工作表。什麼是* DataTable *的列名?無論如何,你是如何創建它的?如果您想問爲什麼DataColumn沒有完整的版本,請發佈您用於加載DataTable –

回答

2

您將無法使用檢索列名稱。從使用OLEDB或ODBC的Excel工作表中獲取。因爲它不是有效的或可識別的語法。

'。''通常我們用它來區分這兩個[schema]。[table]。[column]。

OLEDB,ODBC替換列名'。'以 '#'

燒焦所以你需要

objbulk.ColumnMappings.Add("No#", "Number")