我在从sqlServer中的表填充Windows窗体上的列表框时遇到了一些麻烦。该表是一列字符串值,因为我在整个应用程序中多次调用此值列表,我将其设置为一个类,并在默认构造函数中使用SQL中的值填充ArrayList表,如下:
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命令文本是corrext,因为当我在SQL Management Studio中执行它时,它会按预期返回表中的所有值。但是,程序只是在ExecuteReader()中退出,因此从不填充ArrayList。
我确实想知道该程序是否正在退出,因为'while'循环由于读取器的空结果而跳过,但它甚至没有达到'while'语句。我通过放入MessageBox并在其上放置一个断点来证明这一点。程序永远不会打开消息框,证明它正在ExecuteReader语句中退出该类。
我到底做错了什么!
一如既往,感谢您的帮助。
答案 0 :(得分:4)
如果您收到了异常,那么错误文本将是“在关闭的SQL连接上执行读取器时出错”,因此您应该在尝试从中读取数据之前打开连接:
SqlConnection linkToDB = new SqlConnection(strConnection);
linkToDB.Open(); // <-------
string sqlText = "SELECT * FROM tblCaseTypes;";
SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
SqlDataReader sqlReader = sqlComm.ExecuteReader();
答案 1 :(得分:0)
将您的sqlReader.Read()
代码包裹在Try / Catch块中,它应该变得明显。
默认情况下 - Visual Studio会隐藏一些异常。使用这个try / catch块,您应该能够逐步执行代码并查看异常,这通常可以解释错误。
答案 2 :(得分:0)
如果你在每个地方维护一个dbConnection,那么我确信ExecuteReader可能没有在其他地方正确关闭。
我建议您使用
MultipleActiveResultSets=True
在连接字符串中。