关闭

C#批量插入数据SqlBulkCopy

标签: C#批量插入数据SqlBulkCopy
547人阅读 评论(1) 收藏 举报
分类:
例子:
SqlConnection sqlCon = new SqlConnection(sqlConStr);
sqlCon.Open();
SqlTransaction sqlTran = sqlCon.BeginTransaction(); // 开始事务
SqlBulkCopy sqlBC = new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.Default, sqlTran);
sqlBC.DestinationTableName = "SaleInfo";
sqlBC.BatchSize = 1;

DataTable dtSale = new DataTable();
dtSale.Columns.Add("SaleID", typeof(Int32));
dtSale.Columns.Add("SaleDate",typeof(DateTime));
dtSale.Columns.Add("SaleDep");
dtSale.Columns.Add("Operator");
dtSale.Columns.Add("CusID", typeof(Int32));
dtSale.Columns.Add("SaleServerTime");

DataRow sqlRow = dtSale.NewRow();
sqlRow["SaleID"] = 700;
sqlRow["SaleDate"] = DateTime.Today;
sqlRow["SaleDep"] = "管理部";
sqlRow["Operator"] = "system";
sqlRow["CusID"] = 780;
sqlRow["SaleServerTime"] = "";
dtSale.Rows.Add(sqlRow);

try
{
sqlBC.WriteToServer(dtSale); //此处报错
sqlTran.Commit();

}
catch (Exception)
{
sqlTran.Rollback();
throw;
}
finally
{
sqlBC.Close();
sqlCon.Close();
}
Close();

报错内容:来自数据源的 String 类型的给定值不能转换为指定目标列的类型 smalldatetime。
表结构说明:

CREATE TABLE [SaleInfo] (
[SaleID] [int] NOT NULL ,
[HWSaleID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[SaleDate] [smalldatetime] NULL ,
[SaleDep] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[Operator] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[CusID] [int] NULL ,
[ReturnMoney] [real] NULL ,
[SaleServerTime] [varchar] (9) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_SaleInfo] PRIMARY KEY  CLUSTERED 
(
[SaleID]
)  ON [PRIMARY] 
) ON [PRIMARY]

解答:

查看表结构后发现C#代码中Columns中少了[HWSaleID]
和[ReturnMoney] (程序中没用到),数据库中删除了这2列后程序正常了。

结论:SqlBulkCopy
提交数据不同于Insert语句,DataTable.Columns必须与数据库中的列完全匹配(包括列数量及数据类型).

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32123次
    • 积分:546
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:5篇
    • 译文:0篇
    • 评论:8条
    文章分类
    最新评论