【问题标题】:SqlBulkCopy mapping issue with fullstops in column namesSqlBulkCopy 映射问题,列名中有句号
【发布时间】: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


【解决方案1】:

您将无法使用 检索列名。从使用 OLEDB 或 ODBC 的 excel 表中。因为它不是有效或可识别的语法。

'.'通常我们用它来区分两个 [schema].[table].[column] 这样的。

OLEDB,ODBC 替换列名'.'带有'#'的字符

所以你需要替换你的代码

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

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

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多