C#SqlDataReader关闭

C#SqlDataReader关闭,c#,C#,我不知道为什么会有例外。上面说在我试图访问它之前,阅读器已经关闭了。为什么会这样 代码如下: //Load Projects from SQL Server (nothing else) public SPpowerPlantList loadProjectsFromServer(DateTime timestamp, string note, string sqlServer, string database) { SqlConnection sqlConnection = new S

我不知道为什么会有例外。上面说在我试图访问它之前,阅读器已经关闭了。为什么会这样

代码如下:

//Load Projects from SQL Server (nothing else)
public SPpowerPlantList loadProjectsFromServer(DateTime timestamp, string note, string sqlServer, string database)
{
    SqlConnection sqlConnection = new SqlConnection(String.Format(@"Integrated Security=SSPI;server={0};Initial Catalog={1};", sqlServer, database));
    sqlConnection.Open();

    string selectstring = "SELECT * FROM [dbo].[tblSPpowerPlant]"; //(WHERE note {0} = " + note + " AND timestamp {1} = " + timestamp;
        SqlCommand sqlSelectCommand = new SqlCommand(selectstring, sqlConnection);
    sqlSelectCommand.CommandType = CommandType.Text;
    sqlSelectCommand.CommandText = selectstring;

    SqlDataReader reader;

    SPpowerPlantList powerPlantList = new SPpowerPlantList();

    reader = sqlSelectCommand.ExecuteReader();

    //this line trowhs the exeption
    while (reader.Read())
    {
        foreach (SPpowerPlant powerPlant in powerPlantList)
        {
            powerPlant.ID = reader.GetInt32(0);
            powerPlant.projectName = reader.GetString(1).ToString();
            powerPlant.location = reader.GetString(2); 
            powerPlant.shortName = reader.GetString(3); 
            powerPlant.numberOfWtgs = reader.GetInt32(4); 
            powerPlant.mwWtg = reader.GetDouble(5); 
            powerPlant.mwTotal = reader.GetDouble(6); 
            powerPlant.projectShareWeb = reader.GetDouble(7); 
            powerPlant.mwWeb = reader.GetDouble(8); 
            powerPlant.phase = reader.GetString(9); 
            powerPlant.phaseNumber = reader.GetString(10);
            powerPlant.phaseDescription = reader.GetString(11); 
            powerPlant.projectProgress = reader.GetDouble(12); 
            powerPlant.mwDeveloped = reader.GetDouble(13); 
            powerPlant.projectManager = reader.GetString(14); 
            powerPlant.spaceUrl = reader.GetString(15); 
            powerPlant.country = reader.GetString(16); 
            powerPlant.technology = reader.GetString(17);
            powerPlant.state = reader.GetString(18);
            powerPlant.allPermits = reader.GetDateTime(19);
            powerPlant.cod = reader.GetDateTime(20);
            powerPlant.stateSince = reader.GetDateTime(21);
            powerPlant.spID = reader.GetInt32(22);
            powerPlant.currency = reader.GetString(23);
            powerPlant.possibleWtgTypes = reader.GetString(24);
            powerPlant.hubHeight = reader.GetString(25);
            powerPlant.visibility = reader.GetString(26);
            powerPlant.templateName = reader.GetString(27);

            powerPlantList.Add(powerPlant);
        }

        reader.Dispose();
        sqlConnection.Close(); 
    }

    return powerPlantList;
}
以下是例外(谷歌翻译):

由于数据读取器已关闭,读取访问的尝试无效

我在谷歌上试过,但没有成功。因此,任何帮助都将是巨大的。谢谢你抽出时间


顺便说一句,很抱歉我的英语不是我的母语,但我正在努力学习。

如果你删除每个部分,你就会看到问题所在

  • 你检查一下读卡器是否打开了
  • 您可以遍历powerplant列表,顺便说一句,这是将每个powerplant重新分配给读卡器中的相同记录
  • 您可以关闭并处理读卡器
  • 现在,在抛出异常的while的顶部检查它是否再次打开
  • 我相信您希望从您的阅读器中创建一个新的SPpowerPlant对象列表。您应该将代码更改为以下代码,这样做可以释放读卡器。请注意,您应该像下面的阅读器一样使用语句将所有一次性物品包装在

    using(var reader = sqlSelectCommand.ExecuteReader()) // closes and disposes reader once it is out of scope
    {    
        while (reader.Read()) 
        {
            var powerPlant = new SPpowerPlant();
            powerPlant.templateName = reader.GetString(27);
            //// rest of calls to populate your item
            SPpowerPlantList.Add(powerPlant);
        }
    }
    

    如果你把每一部分都去掉,你就会发现问题所在

  • 你检查一下读卡器是否打开了
  • 您可以遍历powerplant列表,顺便说一句,这是将每个powerplant重新分配给读卡器中的相同记录
  • 您可以关闭并处理读卡器
  • 现在,在抛出异常的while的顶部检查它是否再次打开
  • 我相信您希望从您的阅读器中创建一个新的SPpowerPlant对象列表。您应该将代码更改为以下代码,这样做可以释放读卡器。请注意,您应该像下面的阅读器一样使用
    语句将所有一次性物品包装在

    using(var reader = sqlSelectCommand.ExecuteReader()) // closes and disposes reader once it is out of scope
    {    
        while (reader.Read()) 
        {
            var powerPlant = new SPpowerPlant();
            powerPlant.templateName = reader.GetString(27);
            //// rest of calls to populate your item
            SPpowerPlantList.Add(powerPlant);
        }
    }
    
    代码行

    reader.Dispose();
    sqlConnection.Close(); 
    
    while(reader.read())
    循环中

    另外,您最好使用
    using
    ,而不是自己调用
    Dispose()

    public SPpowerPlantList loadProjectsFromServer(DateTime timestamp, string note, string sqlServer, string database)
    {
        using(var sqlConnection = new SqlConnection(String.Format(@"Integrated Security=SSPI;server={0};Initial Catalog={1};", sqlServer, database)))
        {
            sqlConnection.Open();
    
            var selectstring = "SELECT * FROM [dbo].[tblSPpowerPlant]"; //(WHERE note {0} = " + note + " AND timestamp {1} = " + timestamp;
            var sqlSelectCommand = new SqlCommand(selectstring, sqlConnection);
            sqlSelectCommand.CommandType = CommandType.Text;
            sqlSelectCommand.CommandText = selectstring;
    
            SPpowerPlantList powerPlantList = new SPpowerPlantList();
    
            using(var reader = sqlSelectCommand.ExecuteReader())
            {
                while (reader.Read())
                {
                    foreach (SPpowerPlant powerPlant in powerPlantList)
                    {
                        powerPlant.ID = reader.GetInt32(0);
                        powerPlant.projectName = reader.GetString(1).ToString();
                        powerPlant.location = reader.GetString(2); 
                        powerPlant.shortName = reader.GetString(3); 
                        powerPlant.numberOfWtgs = reader.GetInt32(4); 
                        powerPlant.mwWtg = reader.GetDouble(5); 
                        powerPlant.mwTotal = reader.GetDouble(6); 
                        powerPlant.projectShareWeb = reader.GetDouble(7); 
                        powerPlant.mwWeb = reader.GetDouble(8); 
                        powerPlant.phase = reader.GetString(9); 
                        powerPlant.phaseNumber = reader.GetString(10);
                        powerPlant.phaseDescription = reader.GetString(11); 
                        powerPlant.projectProgress = reader.GetDouble(12); 
                        powerPlant.mwDeveloped = reader.GetDouble(13); 
                        powerPlant.projectManager = reader.GetString(14); 
                        powerPlant.spaceUrl = reader.GetString(15); 
                        powerPlant.country = reader.GetString(16); 
                        powerPlant.technology = reader.GetString(17);
                        powerPlant.state = reader.GetString(18);
                        powerPlant.allPermits = reader.GetDateTime(19);
                        powerPlant.cod = reader.GetDateTime(20);
                        powerPlant.stateSince = reader.GetDateTime(21);
                        powerPlant.spID = reader.GetInt32(22);
                        powerPlant.currency = reader.GetString(23);
                        powerPlant.possibleWtgTypes = reader.GetString(24);
                        powerPlant.hubHeight = reader.GetString(25);
                        powerPlant.visibility = reader.GetString(26);
                        powerPlant.templateName = reader.GetString(27);
    
                        powerPlantList.Add(powerPlant);
                    }
                }
            }           
    
        }
        return powerPlantList;
    }
    
    代码行

    reader.Dispose();
    sqlConnection.Close(); 
    
    while(reader.read())
    循环中

    另外,您最好使用
    using
    ,而不是自己调用
    Dispose()

    public SPpowerPlantList loadProjectsFromServer(DateTime timestamp, string note, string sqlServer, string database)
    {
        using(var sqlConnection = new SqlConnection(String.Format(@"Integrated Security=SSPI;server={0};Initial Catalog={1};", sqlServer, database)))
        {
            sqlConnection.Open();
    
            var selectstring = "SELECT * FROM [dbo].[tblSPpowerPlant]"; //(WHERE note {0} = " + note + " AND timestamp {1} = " + timestamp;
            var sqlSelectCommand = new SqlCommand(selectstring, sqlConnection);
            sqlSelectCommand.CommandType = CommandType.Text;
            sqlSelectCommand.CommandText = selectstring;
    
            SPpowerPlantList powerPlantList = new SPpowerPlantList();
    
            using(var reader = sqlSelectCommand.ExecuteReader())
            {
                while (reader.Read())
                {
                    foreach (SPpowerPlant powerPlant in powerPlantList)
                    {
                        powerPlant.ID = reader.GetInt32(0);
                        powerPlant.projectName = reader.GetString(1).ToString();
                        powerPlant.location = reader.GetString(2); 
                        powerPlant.shortName = reader.GetString(3); 
                        powerPlant.numberOfWtgs = reader.GetInt32(4); 
                        powerPlant.mwWtg = reader.GetDouble(5); 
                        powerPlant.mwTotal = reader.GetDouble(6); 
                        powerPlant.projectShareWeb = reader.GetDouble(7); 
                        powerPlant.mwWeb = reader.GetDouble(8); 
                        powerPlant.phase = reader.GetString(9); 
                        powerPlant.phaseNumber = reader.GetString(10);
                        powerPlant.phaseDescription = reader.GetString(11); 
                        powerPlant.projectProgress = reader.GetDouble(12); 
                        powerPlant.mwDeveloped = reader.GetDouble(13); 
                        powerPlant.projectManager = reader.GetString(14); 
                        powerPlant.spaceUrl = reader.GetString(15); 
                        powerPlant.country = reader.GetString(16); 
                        powerPlant.technology = reader.GetString(17);
                        powerPlant.state = reader.GetString(18);
                        powerPlant.allPermits = reader.GetDateTime(19);
                        powerPlant.cod = reader.GetDateTime(20);
                        powerPlant.stateSince = reader.GetDateTime(21);
                        powerPlant.spID = reader.GetInt32(22);
                        powerPlant.currency = reader.GetString(23);
                        powerPlant.possibleWtgTypes = reader.GetString(24);
                        powerPlant.hubHeight = reader.GetString(25);
                        powerPlant.visibility = reader.GetString(26);
                        powerPlant.templateName = reader.GetString(27);
    
                        powerPlantList.Add(powerPlant);
                    }
                }
            }           
    
        }
        return powerPlantList;
    }
    

    哪一行引发异常?while(reader.Read())this one哪一行引发异常?while(reader.Read())this one和
    sqlConnection.Close()也应该被删除;使用(SqlConnection SqlConnection=newsqlconnection(…))放置
    instead,请和
    SqlConnection.Close()也应该被删除;使用(SqlConnection SqlConnection=newsqlconnection(…))放置
    instead,please@ltanderl-很高兴这么做。即使每个问题只能标记一个答案,你也可以选择多个有用的答案。祝你的项目/代码的其余部分好运。好吧,我需要在这方面再增加3个声誉来提升这些东西。但是谢谢你,我不会放弃。@ltander-很高兴这么做。即使每个问题只能标记一个答案,你也可以选择多个有用的答案。祝你的项目/代码的其余部分好运。好吧,我需要在这方面再增加3个声誉来提升这些东西。但是谢谢你,我不会放弃。