SQLBulk问题集
项目中操作数据库用到这个sqlBulk
场景1:碰到数据批量插入(先加入概念吧)
sqlBC.ColumnMappings.Add(dt的列名,数据库字段);
public static string InsertTable(IDbConnection dbConn, DataTable dt, string TabelName,IEnumerable<ColumnMapInfo> fieldsList=null) { string result = "success"; //声明数据库连接 //using (SqlConnection conn = (SqlConnection)dbConn) SqlConnection conn = (SqlConnection)dbConn; { conn.Open(); //声明SqlBulkCopy ,using释放非托管资源 using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn)) { sqlBC.BulkCopyTimeout = 900;//15分钟 //一次批量的插入的数据量 sqlBC.BatchSize = 10000; //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除 sqlBC.BulkCopyTimeout = 1000; //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。 //sqlBC.NotifyAfter = 10000; //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied); //设置要批量写入的表 sqlBC.DestinationTableName = TabelName; if (fieldsList!=null && fieldsList.Count()>0) { foreach (var m in fieldsList) sqlBC.ColumnMappings.Add(dt的列名,数据库字段); } //try { //批量写入 sqlBC.WriteToServer(dt); } catch (Exception ex) { result = ex.Message; } } conn.Close(); } return result; }
场景2:
给定的 columnmapping 与源或目标中的任意列均不匹配
结果:这个我查询得最久,额,就是列名和数据库不一致(列名的排列顺序无关)
场景3:
如果dt列的数据无法转成数据库对应字段类型(如数据库需要int,但是dt是String的【我】,这里就会出错),
这样子的话,dt的列也需要根据需要进行数据转换
#region changeColum
if (changeColum != null && changeColum.Any())
{
foreach (var item in changeColum)
{
bool hasChange = false;
ArrayList dtList = new ArrayList();
//get data
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
if (dt.Columns[j].ColumnName == item.Key)
{
hasChange = true;
dtList.Add(dt.Rows[i][j].ToString());
}
}
}
if (hasChange)
{
//移除
try
{
dt.Columns.Remove(item.Key);
}
catch (Exception ex)
{ }
switch (item.Value)
{
case 0:
//新增
dt.Columns.Add(item.Key, typeof(Int32));
break;
case 1:
//新增
dt.Columns.Add(item.Key, typeof(Decimal));
break;
case 2:
//新增
dt.Columns.Add(item.Key, typeof(DateTime));
break;
default:
dt.Columns.Add(item.Key, typeof(String));
break;
}
//get changeCol
int changeCol = 0;
for (int j = 0; j < dt.Columns.Count; j++)
{
if (dt.Columns[j].ColumnName == item.Key)
{
changeCol = j;
break;
}
}
//赋值
for (int i = 0; i < dtList.Count; i++)
{
switch (item.Value)
{
case 0:
//赋值
int d = 0;
Int32.TryParse(dtList[i].ToString(), out d);
dt.Rows[i][changeCol] = d;
break;
case 1:
//赋值
decimal d1 = 0;
Decimal.TryParse(dtList[i].ToString(), out d1);
dt.Rows[i][changeCol] = d1;
break;
case 2:
//赋值
DateTime d2;
DateTime.TryParse(dtList[i].ToString(), out d2);
dt.Rows[i][changeCol] = d2;
break;
default:
dt.Rows[i][changeCol] = dtList[i].ToString();
break;
}
}
}
}
}
#endregion
注:这里可以使用SQL Server Profieler 进行跟踪,但是发现只有直接插入的才有可以查看的数据(异常的都是出现在还没组成sql语句执行前的我看不懂的)
感谢:https://bbs.csdn.net/topics/310091635/
https://blog.csdn.net/u010476739/article/details/123335909

浙公网安备 33010602011771号