2011-10-14 1 views
0

SQL Server 데이터베이스 연결을 열고 DataReader 개체에서 테이블의 첫 번째 레코드를 가져온 다음 개체를 닫는 간단한 작업을 수행하고 있습니다. 그러나, 나는 약 5 초 정도의 지연이 연결을 닫는 데 약간의주의를 보였다. 그러나 지연은 명령 개체가 지정된 쿼리를 실행 한 후에 만 ​​발생합니다. 나는 전에 이와 같은 설정에서 일해 왔으며 연결을 종료하는 동안 오랜 지연이 있다는 것을 기억하지 못합니다.비정상적으로 오래 동안 ADO.NET 연결 개체를 닫으려고 일시 중지했습니다. 정상입니까?

Public Sub TestDb() 
    Dim cnStrBuilder As New SqlClient.SqlConnectionStringBuilder 
    Dim cn As New SqlClient.SqlConnection 
    Dim sqlSelectName As New SqlClient.SqlCommand 
    Dim drName As SqlClient.SqlDataReader 
    Dim newName As New SymName 
    Dim i As Integer 

    cnStrBuilder.UserID = "sa" 
    cnStrBuilder.ConnectTimeout = 30 
    cnStrBuilder.Password = "" 
    cnStrBuilder.PersistSecurityInfo = True 
    cnStrBuilder.DataSource = "EMARKET\FL_DB" 
    cnStrBuilder.InitialCatalog = "EmailMarketing" 

    sqlSelectName.CommandType = CommandType.Text 
    sqlSelectName.CommandText = "SELECT * FROM [NAME]" 

    System.Console.WriteLine(cnStrBuilder.ConnectionString) 

    cn.ConnectionString = cnStrBuilder.ConnectionString 

    Try 
     If cn.State = ConnectionState.Closed Then 
      cn.Open() 
     End If 
     System.Console.WriteLine("Connection success") 

     sqlSelectName.Connection = cn 

     System.Console.WriteLine("Execute Reader") 
     drName = sqlSelectName.ExecuteReader 

     If drName.HasRows = True Then 
      System.Console.WriteLine("Read Row") 
      drName.Read() 

      For i = 0 To drName.FieldCount - 1 
       Console.WriteLine(drName.Item(i).ToString) 
      Next 
     End If 

     System.Console.WriteLine("Closing connection") 

     sqlSelectName.Connection.Close() 

    Catch ex As Exception 
     System.Console.WriteLine("Something Happened") 
     System.Console.WriteLine(ex.Message) 
    End Try 

System.Console.WriteLine("Done.") 

End Sub 

나는 연결이 거의 imediately 닫

'System.Console.WriteLine("Execute Reader") 
'drName = sqlSelectName.ExecuteReader 
' 
'If drName.HasRows = True Then 
' System.Console.WriteLine("Read Row") 
' drName.Read() 
' 
' For i = 0 To drName.FieldCount - 1 
'  Console.WriteLine(drName.Item(i).ToString) 
' Next 
'End If 

라인을 생략합니다. 뭐라 구요? 나는 연결을 닫을 때 지연을 야기하는 .ExecuteReader 라인을 좁히고있다. 지연의 원인은 무엇이며 어떻게 해결합니까?

답변

1

전체 테이블을 검색하도록 SQL Server에 지시합니다. 그러나 첫 번째 행이 끝나면 연결을 종료하고 닫습니다. 너와 같이, 나는 연결이 즉시 닫히기를 기대하지만 아마도 서버가 데이터를 빨리 반환 할 수있는 곳으로 테이블을 스풀링하는 중이다.

서버에 한 행만 요청하면 연결이 여전히 느리게 닫습니까? F.e.

sqlSelectName.CommandText = "SELECT TOP 1 * FROM [NAME]" 
+0

우수 생각합니다. 비교적 큰 테이블입니다. 나는 그것을 시도 할 것이다. –

0

일반적으로 연결 개체가 포함 된 문을 사용하여 IDisposable을 구현하는 모든 개체를 래핑해야합니다. 나는 MSDN에서입니다 다음과 같은 것을 구현하려고 할 것입니다 :

http://msdn.microsoft.com/en-us/library/y6wy5a0f.aspx#Y400

Public Sub CreateCommand(ByVal queryString As String, _ 
    ByVal connectionString As String) 
    Using connection As New SqlConnection(connectionString) 
     Dim command As New SqlCommand(queryString, connection) 
     connection.Open() 
     Dim reader As SqlDataReader = _ 
      command.ExecuteReader(CommandBehavior.CloseConnection) 
     While reader.Read() 
      Console.WriteLine("{0}", reader(0)) 
     End While 
    End Using 
End Sub 
관련 문제