c# - 如何检查 SqlBulkCopy 上的列映射?
问题描述
我正在调用 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 列,它没有被触及。
异常消息:“来自数据源的字符串类型的给定值无法转换为指定目标列的类型位。”
这是我的目标表:
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)
);
无论如何,你们可以提供的任何帮助都会很棒。
解决方案
即使您没有填写所有列,您也会将所有数据表传递给批量。标识列 Id 导致索引问题。
我建议将数据批量存储到临时表中,然后使用 T-SQL 语句复制到 LogFiles。
推荐阅读
- android - 使用 SVG 绘制而不是使用带有库的 Canvas
- css - 我的样式表没有覆盖 Normalize.css
- java - java REST客户端调用https时返回handshake_failure
- c# - 如何实现自定义 JsonConverter .NET 来序列化和反序列化 Firestore 的对象
- reactjs - 使用 travis CI 在 github 页面(带有自定义域)上部署 CRA 应用程序,但仅显示 readme.md
- c# - Json 文件中的 Unicode 问题
- r-markdown - 如何从针对docx的R Markdown的代码块中调用的函数插入自定义样式的文本?
- c++ - GDB / C++ - 根据循环条件将多个变量记录到输出文件
- javascript - 键未定义 React
- python - python, numpy 生成不良数据