【发布时间】:2017-05-11 07:21:38
【问题描述】:
我正在尝试将 Excel 工作表导入 SQL Server 数据库。发生的问题与列映射有关。 如果 Excel 工作表中的列名以句号结尾(例如:'No.'、'Name.'),则 C# 抛出异常
Message=给定的 ColumnName 'No.'不匹配任何列 在数据源中。
但如果我删除句号,它工作得非常好。
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();
}
如果您需要更多信息,请告诉我。
【问题讨论】:
-
错误很明显,与Excel无关。您的映射表明您的 Exceldt 中有一个名为
No.的列实际上并不存在。您是否检查了 DataTable 的列名?如果它在没有句号的情况下工作,则意味着列名没有有句号 -
@PanagiotisKanavos,感谢您的快速回复,我的问题是,Excel 工作表中的列名也以句号结尾,然后这个错误就来了。如果我手动重命名列名并从两个(excel表和列映射)中删除句号,则会出错。
-
您正在使用数据表,而不是工作表。 DataTable 的列名是什么?无论如何,你是如何创建它的?如果您想问为什么 DataColumn 没有句号,请发布您用于加载 DataTable 的代码
-
顺便说一句,SqlBulkCopy 也适用于数据读取器。您可以读取工作表数据并将它们直接发布到 SQL Server,而无需先将所有内容加载到内存中。你是如何加载 Excel 工作表的?
-
试试这个 objbulk.ColumnMappings.Add("No#", "Number");
标签: c# sql-server sqlbulkcopy