1. 程式人生 > >C#批量插入資料SqlBulkCopy

C#批量插入資料SqlBulkCopy

例子:
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必須與資料庫中的列完全匹配(包括列數量及資料型別).