首页新闻找找看学习计划

请教C#多线程向SQL插入数据问题

0
悬赏园豆:100 [待解决问题]

我用多线程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("完成!");



}


}

 

 

这就是那段插入代码

转世为神的主页 转世为神 | 初学一级 | 园豆:0
提问于:2012-03-04 04:13
< >
分享
所有回答(10)
0

这个可能要看一下你的程序,是否多线程并不会影响写入数据库的成败,不成功应该是程序有什么问题。

单这一行看,有可能是SQL语句有问题,比如coding中如果有单引号,就会插入失败,而你一步步调试的那条数据可能是没有单引号的。可以考虑使用parameter的形式去做,先把这些可能的问题避免掉,然后再看是不是真的有问题

丁学 | 园豆:18530 (专家六级) | 2012-03-04 08:14
0

cmd.ExecuteNonQuery();

应该是程序问题。仔细检查一下。

小材小用 | 园豆:639 (小虾三级) | 2012-03-04 12:17
0

把你的for循环贴出来看看,没道理直接执行不行,单步调试却可以。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-03-04 15:05
0

用SQL Server Profiler监测一下实际的SQL插入语句

dudu | 园豆:39252 (高人七级) | 2012-03-04 16:17
0

把错误原因贴出来

sanglei | 园豆:143 (初学一级) | 2012-03-04 16:40
0

C#再多线程,可是数据库承受不了这么多并且并行的数据库连接次数开销啊。你试试拼接一定的长度sql语句(多条语句用分号隔开“;”)之后再向数据库一次性提交(减少连接次数的开销)。

慧☆星 | 园豆:5384 (大侠五级) | 2012-03-05 14:31
0

把执行的sql语句贴出来。

az235 | 园豆:8283 (大侠五级) | 2012-03-05 15:51
0

使用bulkcopy 适合大数据量插入,但是不会在数据库中产生日志,也就是无法回滚等。。

chris-shao | 园豆:192 (初学一级) | 2012-03-05 17:35
0

改成这样:

string sql="insert into tb_spider values('" + sql_add[i].ToString() + "','" + webname + "','是')";

cmd.CommandText=(sql);

跟踪看一下sql是否正确(可以拿到数据库里面运行一下)

飞洋过海 | 园豆:242 (菜鸟二级) | 2012-03-06 11:22
0

首先插入语句确定没有问题。

根据经验这种情况通常发生的原因是出现了线程阻塞(该说法不是非常确切)。通俗的讲是由于主线程还没有将权利转交给你的线程。

可能主线程是阻塞式的。如同while(1==1)会造成cpu100%。此时可以wait 1毫秒即可。

建议,启动插入线程后,再wait(1)即可。 例如, {调用 线程1,线程2,thread.Sleep(1)}.

lucika.zh | 园豆:57 (初学一级) | 2012-03-06 15:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册