2012-02-02 45 views
1

我尝试从数据库中查询数据,有时我在日志中出现此错误:我得到这个SQL传输级错误,但不是所有的时间

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The handle is invalid.) The code is inside a try-catch block. What is weird is that i do not get this error all the time. The catch block does get executed.

然而,不管我得到的错误或不,下拉列表我试图填充不填充。好像没有数据从查询中返回。

我正在连接数据库,数据在那里,我可以打开连接并运行查询到数据库。数据库与运行代码的位置在同一台机器上。

另外,代码工作时,我连接到服务器上的数据库,但我试图使本地数据库工作时,我没有连接到服务器。当我想从本地数据库运行时,我只需要更改连接字符串。

下面是查询数据库

public static void QueryDB(string query) 
    { 
     cmd = new SqlCommand(); 
     cmd.CommandText = query; 
     cmd.Connection = MyConn; 
     if (dr != null) dr.Dispose(); 
     dr = cmd.ExecuteReader(); 
    } 

这里是连接字符串连接到数据库的功能:

MyConn = new SqlConnection("Data Source=tcp:localhost; Database=EscalationManagementSystem; Integrated Security=true;"); 

是否有错设置或可这是一个错误在代码中。

在此先感谢。

+0

既然您没有给我们任何代码来审查有关造成这个问题的假设是不可靠的。 – 2012-02-02 18:14:30

+1

我猜'dr'是'SqlDataReader'的一些痛处?这是一个全球变量? – 2012-02-02 18:24:07

+0

对不起,是'dr'是'SqlDataReader'。 – DFord 2012-02-02 18:24:57

回答

2

我认为这是你的代码中的一个错误。我不认为你应该有一个SqlDataReaderSqlCommand这是由所有调用数据库共享。

相反,您应该为每个对数据库的调用实例化一个新的SqlDataReaderSqlCommand,并在应用程序完成特定的SQL调用时处置(关闭)它们。

我的猜测是你的情况会发生什么,SqlDataReaderSqlCommand被另一个数据库调用从你的下拉出来,并且问题是间歇性的,因为这是一个竞争条件。

+0

您是否建议将'SqlDataReader'和'SqlCommand'放入'using'块中? – DFord 2012-02-02 19:41:04

+0

@Dord是的,这是绝对正确的。 – 2012-02-02 20:04:42

+0

我把'SqlDataReader'和'SqlCommand'放在''using'块中,但它仍然不起作用。另外,从我的下拉出来的'SqlDataReader'和/或'SqlCommand'没有意义,因为数据库是本地的,只有当应用程序在本地运行时才会被访问。一切工作,当我使用服务的数据库。 – DFord 2012-02-03 14:38:43

3

这种错误通常会在您重置Sql服务器实例的连接时出现。

原因可能是由于重置网络连接。

其他原因可能是:

您所请求的SQL Server和从连接池接收数据。现在SQL Server发生了一些不好的情况(服务重启),并且你发回一个数据。

检查以确保您的连接在后续请求之间不会中断。

希望这会有所帮助。

+0

我在整个执行过程中检查了连接,并且其状态始终处于打开状态。我仍然没有看到数据显示。 – DFord 2012-02-03 14:35:59

0

此问题是由于您尚未发布数据库连接。只需在您的代码中添加Finally声明并添加conn.Close()conn.Dispose()。我相信它会正常工作。

finally 
{ 
    cmd.Connection.Close(); 
    cmd.Connection.Dispose(); 
} 
相关问题