首页 新闻 搜索 专区 学院

访问远程数据库: 引发了“System.InvalidOperationException”类型的异常

0
悬赏园豆:20 [已关闭问题] 关闭于 2013-01-16 14:45

Windows 应用程序. 访问远程数据库服务器.同一个Connection,  同样的SQL 语句, 只是其中的参数值变了一个, 但是, 执行的结果却是一个成功返回DataReader, 另外一个抛异常.

设置断点, 调试. Connection正常打开, 但是 在执行 cmd.ExecuteReader(CommandBehavior.CloseConnection);时 发生异常.
Exception Message:" 超时时间已到。在操作完成之前超时时间已过或服务器未响应。"
Exception Source: ".Net SqlClient Data Provider"
同时, Connection显示 ServerVersion = “conn.ServerVersion”引发了“System.InvalidOperationException”类型的异常

弄了半天也不知道问题到底出在哪里, 求大家帮忙看看, 先谢过~

问题补充: 贴上代码如下: [SqlHelper.cs](未使用的方法省略) : public sealed class SqlHelper{ private string strConnectionString = ""; public static SqlConnection conn; public SqlHelper(){ strConnectionString = "Server=ACS-GITAP-02;initial catalog=CSReport;uid=xxx;pwd=*****;";} public void OpenConn() {if (conn == null){conn = new SqlConnection(strConnectionString);} if (conn.State != ConnectionState.Open) {try{conn.Open();}catch (Exception ex){throw new Exception(ex.Message);}}} public void CloseConn(){ if (conn != null && conn.State != ConnectionState.Closed) {conn.Close();}} public SqlDataReader ExecuteReader(string query, CommandType cmdType, params SqlParameter[] parameters) {this.OpenConn();SqlDataReader dr; SqlCommand cmd = new SqlCommand(query, conn); cmd.CommandType = cmdType; for (int i = 0; i <= parameters.Length - 1; i++) {cmd.Parameters.Add(parameters[i]);} try{dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);return dr; }catch (Exception ee){this.CloseConn();throw ee;} }} [调用] : string query="select es_guid ....from table_1 where region=@REGION and ....... "; SqlParameter[] parameters = new SqlParameter[1]; parameters[0] = new SqlParameter("@REGION", "EU"); SqlHelper help= new SqlHelper(); SqlDataReader dr = help.ExecuteReader(query, CommandType.Text, parameters); while(dr.Read()){.......} [修改代码如下]: 但是, 貌似还是不行. SqlConnection conn = new SqlConnection("Server=ACS-GITAP-02;initial catalog=CSReport;uid=xxx;pwd=*****;"); try { conn.Open(); SqlCommand cmd = new SqlCommand(query,conn); cmd.CommandType = CommandType.Text; SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()){......} dr.Close(); conn.Close(); } catch (Exception e) { conn.Close(); log.Error("RunTime Exception Message: ", e); } finally{conn.Close();} [Log 信息如下]: Info:RunTime Exception Message: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应.调试, 异常出现在cmd.ExecuteR
虫之工的主页 虫之工 | 初学一级 | 园豆:181
提问于:2010-10-27 13:14
< >
分享
所有回答(4)
0

检查代码,打开的连接可能没有关闭。

邀月 | 园豆:25375 (高人七级) | 2010-10-27 13:23
我的Connection是全局的, 所以使用时如下判断:[conn 是定义的SqlConnection实例] if(conn!=null && conn.State != ConnectionState.Open) conn.open();
支持(0) 反对(0) 虫之工 | 园豆:181 (初学一级) | 2010-10-27 13:28
0

CommandBehavior.CloseConnection 这个表示的意思是如果你通过 cmd.ExecuteReader 得到了 SqlDataReader的实例 dr,当你执行 dr.Close() 的时候连接也会被关闭.

也就是说,当你并发执行的时候,有的线程在 OpenConnection ,有的线程在 CloseConnection,有的线程在 UseConnection.

Launcher | 园豆:45045 (高人七级) | 2010-10-27 13:32
0

第一个成功返回的DataReader要先关闭了再执行第二个sql句。

wang_yb | 园豆:3277 (老鸟四级) | 2010-10-27 13:46
不会存在这样的问题. 因为参数值的来源是Main函数, 而我测试时, 也是每次指定一个固定值来测试的. 只是两个值中, 一个能抓取到数据, 一个就生成了如上异常.
支持(0) 反对(0) 虫之工 | 园豆:181 (初学一级) | 2010-10-27 13:54
1

Stai cercando il più economico R4i card con migliore funzione. Fermare qui. Abbiamo il prezzo più competitivo R4i confrontare con altri fornitori. R4i sdhc, oro, R4i R4i DSI, R4i ds card di vi darà prezzo all'ingrosso marca nuova esperienza. DSTTi Top quality lowestbest di prezzo. Navigazione veloce senza indugio. Commercio all'ingrosso R4i sdhc offre tassi più caldi dell'Internet e alle migliori offerte. Acquistare R4i qui per salvare il vostro tempo e denaro  R4 DS.<a href=http://www.scheda-r4.com>R4 DS</a>

meinay | 园豆:205 (菜鸟二级) | 2010-10-27 18:03
--!!!这是哪国语言? 大虾, 我看不懂. 能不能麻烦你用中文, 实在不行, 换纯英文也可以...
支持(0) 反对(0) 虫之工 | 园豆:181 (初学一级) | 2010-10-28 09:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册