2013-09-26 1 views
0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim n As Integer = 0 
    str = "select Vote from vote where party='Green'" 
    cmd = New SqlCommand(str, con) 
    con.Open() 
    dr = cmd.ExecuteReader() 
    if dr.HasRows Then 
     dr.Read() 
     n = dr("Vote").ToString() 
     n = n + 1 
     Label8.Text = n.ToString() 
    End If 

    str = "update Vote set vote='" + n.ToString() + "' where party='Green'" 
    cmd = New SqlCommand(str, con) 
    cmd.ExecuteNonQuery() 
    dr.Read() 
    cmd.Dispose() 
    con.Close() 

End Sub 
+0

끝에 'dr'도 표시하십시오. –

답변

1

메시지가 매우 명확 해 보입니다. 당신은 SqlDataReader 개체를 사용하는 동안 다른 작업

MSDN says

에 대한 연결을 사용하기 전에 DataReader를 닫습니다 있고, 관련도록 SqlConnection은 SqlDataReader의 서비스를 제공 바쁜 및 다른 작업 될 수있다 SqlConnection을 닫는 것 외에도 수행됩니다. SqlDataReader의 Close 메서드가 호출 될 때까지 이 발생합니다. 예를 들어, 닫기를 호출 할 때까지 출력 매개 변수를 검색 할 수 없습니다.

그런데
.... 
dr.Close() 
str = "update Vote set vote='" + n.ToString() + "' where party='Green'" 
cmd = New SqlCommand(str, con) 
cmd.ExecuteNonQuery() 
' ??? dr.Read() 
cmd.Dispose() 
con.Close() 

, 전체 코드는 사용자가 글로벌 연결 개체를 사용하여이이 시나리오에서는 DataReader를

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim n As Integer = 0 
    str = "select Vote from vote where party='Green'" 
    Using cmd = New SqlCommand(str, con) 
     con.Open() 
     Dim n as Integer 
     Dim result = cmd.ExecuteScalar() 
     if result IsNot Nothing Then 
      n = Convert.ToInt32(result) + 1 
     else 
      n = 1 
     End If 
     Label8.Text = n.ToString() 
     str = "update Vote set vote='" + n.ToString() + "' where party='Green'" 
     cmd.CommandText = str 
     cmd.ExecuteNonQuery() 
     con.Close() 
    End Using 
End Sub 

를 마지막 투표 값을 검색하는 ExecuteScalar는을 사용하여 덤프 단순화 할 수있다 피해야합니다. 연결을 사용해야 할 때 항상 연결을 만들고 열거 나 사용하고 파괴하는 것이 더 좋습니다. 하는 SqlClient 클래스는 아래와 같이

0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    try 

    Dim n As Integer = 0 

    str = "select Vote from vote where party='Green'" 
    cmd = New SqlCommand(str, con) 
    con.Open() 

    dr.Close() 
    dr = cmd.ExecuteReader() 
    if dr.HasRows Then 
     dr.Read() 
     n = dr("Vote").ToString() 
     n = n + 1 
     Label8.Text = n.ToString() 
    End If 

    str = "update Vote set vote='" + n.ToString() + "' where party='Green'" 
    cmd = New SqlCommand(str, con) 
    cmd.ExecuteNonQuery() 
    dr.Read() 

    Finally 

    cmd.Dispose() 
    con.Close() 

    End Try 

End Sub 
0

가 연결 문자열로 설정 여러 활성 결과를 추가 연결과 같은 귀중한 자원 관리에 많은 도움이 될 수있는 Connection Pooling 인프라를 사용할 수

예 :

"Server=Server;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true;" 
관련 문제