C# 连接sql sever2005 多线程并行错误,求解

问题如下:
  现在要进行大量的相似的计算,于是开启多个线程并行提高效率,
  每个线程都要与数据库交换数据(使用存储过程(exec Get_Data '" + dr_ds1[0][0].ToString() + "','" + from_count + "', '" + dr_ds2[0][0].ToString() + "','" + Convert.ToDateTime(time1).ToString("yyyy-MM-dd HH:mm:ss") + "','" + Convert.ToDateTime(time2).ToString("yyyy-MM-dd HH:mm:ss") + "';))
  为了减少与数据库的交换次数,我将存储过程语句累加完,一次性将需要的数据提取到本地,每个线程中存储过程一般要累加30来次,问题出现在这里,当我开启多线程并行计算的时候会出现
Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。
这问题
我如果不将存储过程进行累加就不会出现这种错误,但是交互次数太多严重影响计算效率,请大侠们帮忙解决这个问题。

作者: linbing1988   发布时间: 2011-06-09

将存储过程进行累加
是个什么操作?

作者: P1mm   发布时间: 2011-06-09

调用存储过程语句进行累加,
像这样(exec Get_Data '" + dr_ds1[0][0].ToString() + "','" + from_count + "', '" + dr_ds2[0][0].ToString() + "','" + Convert.ToDateTime(time1).ToString("yyyy-MM-dd HH:mm:ss") + "','" + Convert.ToDateTime(time2).ToString("yyyy-MM-dd HH:mm:ss") + "';exec Get_Data '" + dr_ds1[0][0].ToString() + "','" + from_count + "', '" + dr_ds2[0][0].ToString() + "','" + Convert.ToDateTime(time1).ToString("yyyy-MM-dd HH:mm:ss") + "','" + Convert.ToDateTime(time2).ToString("yyyy-MM-dd HH:mm:ss") + "')

作者: linbing1988   发布时间: 2011-06-09

存储过程调用是采用参数传递方式进行的,你把这些字符串连接起来,好像不是为存储过程调用而作准备吧.
另外,存储过程中做了些什么?

作者: qianjin036a   发布时间: 2011-06-09

exec Get_Data '" + dr_ds1[0][0].ToString() + "','" + from_count + "', '" + dr_ds2[0][0].ToString() + "','" + Convert.ToDateTime(time1).ToString("yyyy-MM-dd HH:mm:ss") + "','" + Convert.ToDateTime(time2).ToString("yyyy-MM-dd HH:mm:ss") + "'
这就是一个存储过程的条用Get_Data 为存储过程的名称,后面那些事变量!
下面是存储过程的创建
ALTER PROCEDURE [dbo].[Get_Data]  
  ( @System_ID int,
  @from_ID int,
  @Var_ID int,
  @begin_t datetime,
  @end_t datetime
  )
  AS  
  select iMainID_PK,sMain,convert(varchar,dDate,23) as dDate ,convert(varchar,dTime,108) as dTime ,mOpen ,mHigh ,mLow ,mClose ,iVol,iPoi,mCloseMonth ,iLots ,isnull(tb_SingleSystemData.iPupil,null) as iPupil from tb_Price left join tb_SingleSystemData on iMainID_FK=iMainID_PK and iSystemID_FK=@System_ID where iMainID_PK>@from_ID and iVarietyID_FK= @Var_ID and ((CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))>=@begin_t and (CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))<=@end_t)order by dDate,dTime;

作者: linbing1988   发布时间: 2011-06-09

C# code
//延长超时时间:
myConnection.ConnectionTimeout = 100;
myCommand.SelectCommand.CommandTimeout = 60; 

作者: wwwwgou   发布时间: 2011-06-09

引用 5 楼 wwwwgou 的回复:
C# code
//延长超时时间:
myConnection.ConnectionTimeout = 100;
myCommand.SelectCommand.CommandTimeout = 60;

这办法前面试过,没用。

作者: linbing1988   发布时间: 2011-06-09

有没别的什么方法,各位大神帮帮忙啊!

作者: linbing1988   发布时间: 2011-06-09

1、这样累加能提高效率?应该没有任何作用的
2、关键是
where iMainID_PK>@from_ID and iVarietyID_FK= @Var_ID and ((CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))>=@begin_t and (CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))<=@end_t)
这样的写法没有效率可言

作者: P1mm   发布时间: 2011-06-09

这里为什么要用两个字段(dDate、dTime)记录时间?这样设计造成现在想修改语句都较难了

作者: P1mm   发布时间: 2011-06-09

试改了一下,发现确实太难改了,放弃

如果一定用两个字段,建议dDate、dTime都用int,比如
sdate 表示2011-06-09,就用int值20110609
stime 表示23:11:04,就用int值231104
这样还好改些

关键需要使用dDate、dTime上的索引,你现在写法根本不会使用这两个字段的索引

作者: P1mm   发布时间: 2011-06-09

减少数据库的访问次数不会提高效率?
造成timeout的问题是因为用两个字段存储时间的原因?
如果是一个字段记录时间,应该怎么改呢?

作者: linbing1988   发布时间: 2011-06-09

是的,你等于是一次调用多次存储过程,这样实际执行是串行的,执行时间是总时间,就会有可能超时了


一个字段很好改了
where iMainID_PK>@from_ID and iVarietyID_FK= @Var_ID 
and dDatetime>=@begin_t and dDatetime<=@end_t

假设字段是dDatetime

作者: P1mm   发布时间: 2011-06-09

引用 12 楼 p1mm 的回复:
是的,你等于是一次调用多次存储过程,这样实际执行是串行的,执行时间是总时间,就会有可能超时了


一个字段很好改了
where iMainID_PK>@from_ID and iVarietyID_FK= @Var_ID
and dDatetime>=@begin_t and dDatetime<=@end_t

假设字段是dDatetime

关于多次调用的问题,我的做法的确有点问题,我觉得:应该在调用次数和链接次数上取个平衡点。
dDatetime>=@begin_t and dDatetime<=@end_t与((CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))>=@begin_t and (CONVERT(varchar(10),dDate,120)+' '+CONVERT(varchar(10),dTime,108))<=@end_t)
的区别在哪里?

作者: linbing1988   发布时间: 2011-06-09

还有个问题就是我如果直接上数据库上同时运行100条存储过程不会超时;会不会跟多线程有关造成的超时?

作者: linbing1988   发布时间: 2011-06-09

大神们出来帮帮忙啊!

作者: linbing1988   发布时间: 2011-06-09