如何检查SqlBulkCopy上的列映射?

时间:2018-09-12 15:55:11

标签: c# sql tsql ado.net

我正在调用SqlBulkCopy.WriteToServer,传入数据表。该表有五列,但是我只想填充每行两列。

float uniform fadeOut;
in vec4  fragColor;
out vec4 finalColor;
....
finalColor = mix(vec4(0.0), fragColor, fadeOut);

我得到的错误提示某个地方,一个字符串被强制转换为一个位,但是我唯一拥有的是成功列,该列未被触及。

异常消息:“数据源中String类型的给定值无法转换为指定目标列的类型位。”

这是我要定位的表

public static void LoadLogFiles(SqlConnection connection, IEnumerable<LogFile> logFiles)
    {
        using (var bulkCopier = new SqlBulkCopy(connection))
        {
            bulkCopier.DestinationTableName = ConfigurationManager.AppSettings["DestinationTable"];
            var dt = BuildLogFileDataTable(logFiles);
            try
            {
                bulkCopier.WriteToServer(dt);
            }
            catch (Exception e)
            {
                throw new Exception("SqlBulkCopy failed.", e);
            }
        }
    }
    private static DataTable BuildLogFileDataTable(IEnumerable<LogFile> logFiles)
    {
        var logFileTable = new DataTable("LogFiles");

        var idColumn = new DataColumn();
        idColumn.DataType = Type.GetType("System.Int32");
        idColumn.ColumnName = "Id";
        logFileTable.Columns.Add(idColumn);

        var pathColumn = new DataColumn();
        pathColumn.DataType = Type.GetType("System.String");
        pathColumn.ColumnName = "Path";
        logFileTable.Columns.Add(pathColumn);

        var fileNameColumn = new DataColumn();
        fileNameColumn.DataType = Type.GetType("System.String");
        fileNameColumn.ColumnName = "FileName";
        logFileTable.Columns.Add(fileNameColumn);

        var successColumn = new DataColumn();
        successColumn.DataType = Type.GetType("System.Boolean");
        successColumn.ColumnName = "Success";
        logFileTable.Columns.Add(successColumn);

        var errorMessageColumn = new DataColumn();
        errorMessageColumn.DataType = Type.GetType("System.String");
        errorMessageColumn.ColumnName = "ErrorMessgae";
        logFileTable.Columns.Add(errorMessageColumn);

        foreach (var logFile in logFiles)
        {
            var row = logFileTable.NewRow();
            row["Path"] = logFile.Path;
            row["FileName"] = logFile.FileName;

            logFileTable.Rows.Add(row);
        }

        return logFileTable;
    }

无论如何,你们大家都可以提供任何帮助。

2 个答案:

答案 0 :(得分:2)

即使不填写所有列,也要将所有数据表传递给批量。标识列ID导致索引问题。

我建议将数据批量存储到临时表中,然后使用T-SQL语句复制到LogFiles。

答案 1 :(得分:1)

我以前有这个问题。我与新添加的列的顺序有关。确保使用SetOrdinal添加新列是基表的顺序。

logFileTable.Columns.Add(pathColumn).SetOrdinal(1);//for Path
logFileTable.Columns.Add(pathColumn).SetOrdinal(2);//for FileName