【问题标题】:How do you check the columnmapping on a SqlBulkCopy?如何检查 SqlBulkCopy 上的列映射?
【发布时间】:2019-02-17 08:00:35
【问题描述】:

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

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;
    }

我得到的错误表明在某个地方,一个字符串被转换成一个位,但我唯一的位是 Success 列,它没有被触及。

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

这是我要定位的表:

CREATE TABLE [dbo].[LogFiles] (
[Id]           INT            IDENTITY (1, 1) NOT NULL,
[Path]         NVARCHAR (MAX) NULL,
[FileName]     NVARCHAR (MAX) NULL,
[Success]      BIT            NULL,
[ErrorMessgae] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.LogFiles] PRIMARY KEY CLUSTERED ([Id] ASC)
);

无论如何,你们能提供的任何帮助都会很棒。

【问题讨论】:

    标签: c# sql tsql ado.net


    【解决方案1】:

    即使您不填充所有列,您也会将所有数据表传递给批量。标识列 Id 导致索引问题。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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