SqlBulkCopy - 给定的ColumnName与源或目标中的任何列都不匹配

Por*_*ges 5 c# sql-server sqlbulkcopy

我正在尝试使用SqlBulkCopy将数据复制到SQL数据库表中,但它(错误地)说列不匹配.他们匹配.如果我使用断点来查看要映射的列的名称,它们是正确的.错误消息显示列的名称,并且它是正确的.

这是我的方法.我有一个相同的方法工作,唯一的区别是哪里得到的列名.但是,包含列名的字符串完全相同.

    public static bool ManualMapImport(DataTable dataTable, string table)
    {
        if(dataTable != null)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlBulkCopy import = new SqlBulkCopy(connection);
            import.DestinationTableName = "[" + table + "]";
            foreach (string s in Global.SelectedColumns)
            {                    
            /* The s string variable here is the EXACT same as
               the c.ToString() in the other method below */

                if (ColumnExists(table, s))
                    import.ColumnMappings.Add(s, s); 
                else
                    return false;
            }

            connection.Open();
            import.WriteToServer(dataTable); //Error happens on this line
            connection.Close();

            return true;
        }
        else
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是几乎完全相同的工作方法:

    public static bool AutoMapImport(DataTable dataTable, string table)
    {
        if (dataTable != null)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlBulkCopy import = new SqlBulkCopy(connection);
            import.DestinationTableName = "[" + table + "]";           
            foreach (DataColumn c in dataTable.Columns)
            {
                if (ColumnExists(table, c.ToString()))
                    import.ColumnMappings.Add(c.ToString(), c.ToString());
                else
                    return false;
            }

            connection.Open();
            import.WriteToServer(dataTable);
            connection.Close();

            return true;
        }
        else
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果有帮助,列名称为:ACT_Code,ACT_Paid,ACT_Name,ACT_Terminal_Code,ACT_TCustom1,ACT_TCustom2.这些在数据库本身完全相同.我知道SqlBulkCopy映射区分大小写,并且列名确实是正确的.

这是错误消息:

System.Data.dll中发生了未处理的"System.InvalidOperationException"类型异常

附加信息:给定的ColumnName"ACT_Code"与数据源中的任何列都不匹配.

希望我只是遗漏了一些明显的东西,但我很好,真的迷失了.

非常感谢.

编辑:对于任何发生与我有同样问题的人,这是我如何解决它.

我不是让ManualMapImport()方法成为近乎克隆的 AutoMapImport(),而是让它循环遍历数据表的列并更改名称,然后AutoMapImport()使用修改后的数据表调用,从而无需尝试使用普通字符串进行映射.

RBa*_*ung 4

根据 MSDN(此处),该DataColumn.ToString()方法返回“如果设置了属性,则返回表达式值;否则返回 ColumnName 属性。 ”。

我总是发现该ToString()方法无论如何都不稳定(可以根据当前状态/条件进行更改),因此我建议改用该ColumnName属性,因为这就是您实际上想要摆脱的ToString()


好的,如果做不到这一点,那么我不得不猜测这是源数据表中列名称区分大小写的问题,因为即使 SQL DB 不区分大小写,也是如此SQLBulkCopy。为了解决这个问题,我想说,当您检查该列是否存在时,您应该返回/使用数据表的列列表本身中的实际字符串,而不是使用传入的任何字符串。这应该能够解决您的 ColumnsExist 例程可能会忽略的任何大小写或重音差异。