Как вы проверяете сопоставление столбцов в SqlBulkCopy? - PullRequest
0 голосов
/ 12 сентября 2018

Я вызываю 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;
    }

Ошибка, которую я получаю, предполагает, что где-то строка преобразуется в бит, но это единственноебит, который у меня есть, - это столбец Успех, который не затрагивается.

Сообщение об исключении: «Указанное значение типа 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)
);

В любом случае, любая помощь, которую вы, парни и девушки, могли бы предложить, была бы полезной.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Даже если вы не заполняете все столбцы, вы передаете всю массив данных, доступный для данных. Идентификатор столбца идентификации вызывает проблему с индексом.

Я предлагаю объединить данные в промежуточную таблицу, а затем скопировать в LogFiles с помощью оператора T-SQL.

0 голосов
/ 12 сентября 2018

У меня была эта проблема раньше.Я имею отношение к порядку недавно добавленных столбцов.Убедитесь, что вы добавили новый столбец в порядке базовой таблицы, используя SetOrdinal.

logFileTable.Columns.Add(pathColumn).SetOrdinal(1);//for Path
logFileTable.Columns.Add(pathColumn).SetOrdinal(2);//for FileName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...