使用SqlBulkCopy插入数据时出错

我正在尝试使用SqlBulkCopy批量插入数据到SQL 2008。

这是我的表:

 IF OBJECT_ID(N'statement', N'U') IS NOT NULL DROP TABLE [statement] GO CREATE TABLE [statement]( [ID] INT IDENTITY(1, 1) NOT NULL, [date] DATE NOT NULL DEFAULT GETDATE(), [amount] DECIMAL(14,2) NOT NULL, CONSTRAINT [PK_statement] PRIMARY KEY CLUSTERED ( [ID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO 

这是我的代码:

 private DataTable GetTable() { var list = new List(); list.Add(new DataColumn("amount", typeof(SqlDecimal))); list.Add(new DataColumn("date", typeof(SqlDateTime))); var table = new DataTable("statement"); table.Columns.AddRange(list.ToArray()); var row = table.NewRow(); row["amount"] = (SqlDecimal)myObj.Amount; // decimal Amount { get; set; } row["date"] = (SqlDateTime)myObj.Date; // DateTime Date { get; set } table.Rows.Add(row); return table; } private void WriteData() { using (var bulk = new SqlBulkCopy(strConnection, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls)) { //table.Columns.ForEach(c => bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping(c.ColumnName, c.ColumnName))); bulk.BatchSize = 25; bulk.DestinationTableName = "statement"; bulk.WriteToServer(GetTable()); // a table from GetTable() } } 

所以我收到错误:

来自数据源的SqlDateTime类型的给定值无法转换为指定目标列的类型date

为什么?? 我该如何解决这个问题? 请帮帮我!

使用原始表脚本,以下代码有效。

 private static DataTable GetTable() { var list = new List(); list.Add(new DataColumn("amount", typeof(Double))); list.Add(new DataColumn("date", typeof(DateTime))); var table = new DataTable("statement"); table.Columns.AddRange(list.ToArray()); var row = table.NewRow(); row["amount"] = 1.2d; row["date"] = DateTime.Now.Date; table.Rows.Add(row); return table; } private static void WriteData() { string strConnection = "Server=(local);Database=ScratchDb;Trusted_Connection=True;"; using (var bulk = new SqlBulkCopy(strConnection, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls)) { bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("amount", "amount")); bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("date", "date")); bulk.BatchSize = 25; bulk.DestinationTableName = "statement"; bulk.WriteToServer(GetTable()); } } 

正如Amal所说,由于Identity列,您需要列映射。

SQL Date类型与SQL DateTime类型不同。 我认为表中的日期列必须是DateTime类型,具体取决于您使用它的方式。

SQL日期类型
SQL DateTime类型

更新:

我认为Marc的答案应该有效,但你可能需要从源DataTable到目的地指定SqlBulkCopyColumnMappings,否则它可能会导致映射错误,因为输入表的结构与输出表完全不匹配,即日期顺序和行列交换。

例如

 var amount = new SqlBulkCopyColumnMapping("amount", "amount"); var date = new SqlBulkCopyColumnMapping("date", "date"); bulk.ColumnMappings.Add(amount); bulk.ColumnMappings.Add(date); 

SqlDateTime表示原始datetime类型。 您是否尝试过在DataTable使用DateTime .NET类型? 我希望它可以将其转换为TSQL datetimedate类型。 Ditto decimal而不是SqlDecimal