C# ExecuteReader()生成程序退出类
从sqlServer中的表填充windows窗体上的列表框时遇到了一些问题。该表是一列字符串值,由于我很可能在整个应用程序中多次调用此值列表,因此我将其设置为一个类,并在默认构造函数中使用SQL表中的值填充ArrayList,如下所示:C# ExecuteReader()生成程序退出类,c#,sql,C#,Sql,从sqlServer中的表填充windows窗体上的列表框时遇到了一些问题。该表是一列字符串值,由于我很可能在整个应用程序中多次调用此值列表,因此我将其设置为一个类,并在默认构造函数中使用SQL表中的值填充ArrayList,如下所示: class cCaseType { public ArrayList aValues = new ArrayList(); public cCaseType() { string strConnection = Buil
class cCaseType
{
public ArrayList aValues = new ArrayList();
public cCaseType()
{
string strConnection = BuildConnectionString();
SqlConnection linkToDB = new SqlConnection(strConnection);
string sqlText = "SELECT * FROM tblCaseTypes;";
SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
SqlDataReader sqlReader = sqlComm.ExecuteReader();
MessageBox.Show("Hi");
while (sqlReader.Read())
{
aValues.Add(sqlReader["CaseType"].ToString());
}
sqlReader.Close();
linkToDB.Close();
}
public string BuildConnectionString()
{
cConnectionString cCS = new cConnectionString();
return cCS.strConnect;
}
}
现在我知道数据库连接正在工作,因为在整个应用程序中都使用相同的连接。我知道SQL命令文本是corrent,因为当我在SQL Management Studio中执行它时,它会按预期返回表中的所有值。但是,程序只是在ExecuteReader()处退出,因此永远不会填充ArrayList
我确实想知道程序是否因为读卡器的空结果而跳过了“while”循环而退出,但它甚至没有到达“while”语句。我通过在MessageBox中放置断点来证明这一点。程序从不打开messagebox,以证明它正在ExecuteReader语句上退出类
我到底做错了什么
一如既往,感谢您的帮助。如果您捕获到异常,错误文本将是“在关闭的sql连接上执行读取器时出错”,因此您应该在尝试从中读取数据之前打开连接:
SqlConnection linkToDB = new SqlConnection(strConnection);
linkToDB.Open(); // <-------
string sqlText = "SELECT * FROM tblCaseTypes;";
SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
SqlDataReader sqlReader = sqlComm.ExecuteReader();
SqlConnection linkToDB=新的SqlConnection(strConnection);
linkToDB.Open();// 如果捕获到异常,错误文本将是“在关闭的sql连接上执行读卡器时出错”,因此您应该在尝试从中读取数据之前打开连接:
SqlConnection linkToDB = new SqlConnection(strConnection);
linkToDB.Open(); // <-------
string sqlText = "SELECT * FROM tblCaseTypes;";
SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
SqlDataReader sqlReader = sqlComm.ExecuteReader();
SqlConnection linkToDB=新的SqlConnection(strConnection);
linkToDB.Open();// 将sqlReader.Read()
代码包装在一个Try/Catch块中,它应该变得显而易见
默认情况下,VisualStudio将隐藏一些异常。有了这个try/catch块,您应该能够一步一步地浏览代码,并看到异常,这通常是不言自明的错误所在。将您的sqlReader.Read()
代码包装在try/catch块中,它应该变得显而易见
默认情况下,VisualStudio将隐藏一些异常。有了这个try/catch块,您应该能够一步一步地浏览代码并看到异常,这通常可以很好地解释错误所在。如果您在每个位置都维护一个数据库连接,那么我确信ExecuteReader可能没有在其他位置正确关闭
我建议你使用
MultipleActiveResultSets=True
在您的连接字符串中。如果您在每个位置都维护一个数据库连接,那么我确信ExecuteReader可能没有在其他位置正确关闭
我建议你使用
MultipleActiveResultSets=True
在您的连接字符串中。您试过调试吗?在构造函数中执行复杂操作(并且从db加载数据是“comlex”)的小建议不是很好的做法。将您的代码提取到方法中。您试过调试吗?在构造函数中执行复杂操作(并且从db加载数据是“comlex”)的小建议不是很好的做法。将代码提取到方法中。@Matten基本上从内存中为您完成了调试步骤。虽然他的回答很明显,但我仍然认为在这种情况下使用Try/Catch会让您受益匪浅。您将能够通过这种方式解决自己的许多问题。@Origin——是的,这就是我所说的“如果您捕获了异常”的意思。。SQL语句、IO和许多事情都应该在try/catch语句中执行。有太多可能的错误,打字错误,sql server没有响应,网络关闭,…@Matten基本上从内存中为您完成了调试步骤。虽然他的回答很明显,但我仍然认为在这种情况下使用Try/Catch会让您受益匪浅。您将能够通过这种方式解决自己的许多问题。@Origin——是的,这就是我所说的“如果您捕获了异常”的意思。。SQL语句、IO和许多事情都应该在try/catch语句中执行。有这么多可能的错误,打字错误,sql server没有响应,网络关闭。。。