ExecuteReader()使程序退出Class

时间:2012-01-02 09:35:30

标签: c# sql

我在从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语句中退出该类。

我到底做错了什么!

一如既往,感谢您的帮助。

3 个答案:

答案 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 

在连接字符串中。