Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExecuteReader()生成程序退出类_C#_Sql - Fatal编程技术网

C# ExecuteReader()生成程序退出类

C# ExecuteReader()生成程序退出类,c#,sql,C#,Sql,从sqlServer中的表填充windows窗体上的列表框时遇到了一些问题。该表是一列字符串值,由于我很可能在整个应用程序中多次调用此值列表,因此我将其设置为一个类,并在默认构造函数中使用SQL表中的值填充ArrayList,如下所示: class cCaseType { public ArrayList aValues = new ArrayList(); public cCaseType() { string strConnection = Buil

从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命令文本是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没有响应,网络关闭。。。