2016-04-03 102 views
1

我正在处理VS13和SQL Server 2012中的项目,并且遇到了一些小问题。我似乎无法从我的数据库中读取数据。每当我尝试对用于读取数据的SqlDataReader对象执行任何操作时,它都会抛出异常。SqlDataReader对象在每次执行操作时都会抛出异常

我得到的例外是InvalidOperationException

看看我的代码,我用SQL查询作为参数调用这个函数,并将返回的对象存储在另一个SqlDataReader对象中。

private SqlDataReader reader (string sqCommand) 
{ 
     myConnection.Open(); 
     string string1; 
     string1 = sqCommand; 
     SqlDataReader a = null; 

     try 
     { 
      SqlCommand Newcommand = new SqlCommand(string1, myConnection); 
      a = Newcommand.ExecuteReader(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 

     myConnection.Close(); 

     if (a.Read())  //**statement 1** 
      return a; 
     else 
      return null; 
    } 

我得到在标记在上面和我的对象或接收到该对象执行每个操作的代码的声明1除外。

任何人都可以告诉我什么是我的代码错误或提供任何其他解释?如果需要更多其他代码部分来查找错误,我可以提供。

感谢您的时间和您可能提供的帮助。 :)

+0

看看这篇文章可能会对你有帮助。 http://stackoverflow.com/questions/23187029/sqldatareader-invalidoperationexception –

回答

3

当您使用SqlDataReader时,您的连接需要保持打开状态。您的SqlDataReader更传统的用法如下:

private List<object> Reader(string sqCommand) 
{ 
    using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
    { 
     myConnection.Open(); 

     using (SqlCommand cmd = new SqlCommand(sqCommand, myConnection)) 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      List<object> list = new List<object>(); 

      while (reader.Read()) 
      { 
       list.Add(reader[0]); 
      } 

      return list; 
     } 
    } 
} 
+0

感谢您的帮助。我想在连接打开的同时,我正在尝试修复它时需要一分钟前使用读取器。我只是碰巧读取了异常提供的信息,并且表示连接已关闭,因此无法执行我想要的操作。我实际上通过在form_load函数中打开连接并在最后关闭它(在退出时)来修复问题,因为这只是一个登录表单。 –

+0

@SahilSoni,尽管你已经得到了正如你所提到的代码工作,但我建议你按照Kirill的例子重构。最佳做法是遵循“开放迟到早期”模式,利用IDisposable(使用)来管理资源。 –

+0

@DanGuzman没关系,我会为“开放迟到早”做必要的修改。我正在从事的这个项目有点浪费,它不会在任何地方使用,但是我必须这样做是因为我的大学课程。我还有另外一个项目,我会在6月份开始工作,那将会很棒!如果我不能自己修复这些问题,我会在本网站上发布我的问题。 –

相关问题