我用多线程FOR循环向数据库插入数据,全部失败;没有一条数据。然后我就不用多线程了,直接for循环SqlCommand cmd = new SqlCommand("insert into tb_custom_1 values('" + module + "','" + type + "','" + describe + "','" + webname + "','" + coding + "')", conn)
仍然是失败,,可是我断点调试时一步步的向下走,却成功插入数据了?这是怎么回事?
----------------------------------------------------------------------------------
这是我上面一个问题,,下面我想向前辈们请教一个多线程且高效稳定的插入sq数据l的方法。
希望解答详细一下,谢谢大家。
public void test_sql()
{
SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=软件数据库");
conn.Open();
SqlCommand cmd = new SqlCommand();
for (int i = 0; i < sql_add.Count; i++)
{
cmd.CommandText=("insert into tb_spider values('" + sql_add[i].ToString() + "','" + webname + "','是')");
cmd.Connection = conn;
//cmd.CommandType
cmd.ExecuteNonQuery();
}
MessageBox.Show("完成!");
}
}
这就是那段插入代码
这个可能要看一下你的程序,是否多线程并不会影响写入数据库的成败,不成功应该是程序有什么问题。
单这一行看,有可能是SQL语句有问题,比如coding中如果有单引号,就会插入失败,而你一步步调试的那条数据可能是没有单引号的。可以考虑使用parameter的形式去做,先把这些可能的问题避免掉,然后再看是不是真的有问题
cmd.ExecuteNonQuery();
应该是程序问题。仔细检查一下。
把你的for循环贴出来看看,没道理直接执行不行,单步调试却可以。
用SQL Server Profiler监测一下实际的SQL插入语句
把错误原因贴出来
C#再多线程,可是数据库承受不了这么多并且并行的数据库连接次数开销啊。你试试拼接一定的长度sql语句(多条语句用分号隔开“;”)之后再向数据库一次性提交(减少连接次数的开销)。
把执行的sql语句贴出来。
使用bulkcopy 适合大数据量插入,但是不会在数据库中产生日志,也就是无法回滚等。。
改成这样:
string sql="insert into tb_spider values('" + sql_add[i].ToString() + "','" + webname + "','是')";
cmd.CommandText=(sql);
跟踪看一下sql是否正确(可以拿到数据库里面运行一下)
首先插入语句确定没有问题。
根据经验这种情况通常发生的原因是出现了线程阻塞(该说法不是非常确切)。通俗的讲是由于主线程还没有将权利转交给你的线程。
可能主线程是阻塞式的。如同while(1==1)会造成cpu100%。此时可以wait 1毫秒即可。
建议,启动插入线程后,再wait(1)即可。 例如, {调用 线程1,线程2,thread.Sleep(1)}.