C#批量插入資料SqlBulkCopy
阿新 • • 發佈:2019-01-28
例子: 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必須與資料庫中的列完全匹配(包括列數量及資料型別).