已经看过类似我的问题,但它们都不适合我,这是我的代码
dbconn = New SqlConnection
dbconn.ConnectionString = ("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19; MultipleActiveResultSets = true")
Dim reader As SqlDataReader
Dim sda As New SqlDataAdapter
Dim ds As New DataSet()
Try
dbconn.Open()
Dim sql As String
sql = "select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender"
dbcomm = New SqlCommand(sql, dbconn)
reader = dbcomm.ExecuteReader
sda.SelectCommand = dbcomm
sda.Fill(ds, "Student_Info")
Catch ex As SqlException
MessageBox.Show(ex.Message)
Finally
dbconn.Dispose()
End Try
答案 0 :(得分:4)
你根本不使用那个阅读器,所以我不理解你的代码。您想要使用DataSet
填充DataAdapter
,然后需要这样做(始终使用Using
):
Dim ds As New DataSet()
Using dbconn As New SqlConnection("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19;MultipleActiveResultSets = true")
Dim sda = New SqlDataAdapter("select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender", dbconn)
Try
sda.Fill(ds, "Student_Info") ' you dont need to open/close the connection
Catch ex As SqlException
MessageBox.Show(ex.Message)
End Try
End Using
答案 1 :(得分:1)
我会尝试确保所有一次性物品都在此功能中妥善处理。我建议使用Using
语句来帮助确保任何一次性对象在超出范围时得到妥善处理。我相信SqlConnection
,SqlDataReader
,SqlDataAdapter
和DataSet
都是一次性的。
编辑虽然我认为Tim的答案更针对您的问题(SqlDataReader
未使用且不必要),但您也应该确保清理所有的一次性物品。如果你做使用SqlDataReader,你需要在做任何其他事情之前处置它,除非你只是想证明你可以打开多个结果集在这种情况下,在同一连接的多次访问中缺少清理可能是负责的(如果其中一个不包含MultipleActiveResultSets)。
答案 2 :(得分:1)
首先,在这种情况下,您不需要使用阅读器,只需要SQLDataAdapter。
其次,您应该使用Conn.Close()来关闭SQL连接,而不是Conn.Dispose()。该错误意味着您的代码中的某些位置,您事先打开了连接,但从未关闭它。