2012-01-31 8 views
1

IIS7에서 Server 2008에 대한 SQL 쿼리에 문제가 있습니다. 업데이트 문을 실행하는 VB.NET 클래스 라이브러리가 있습니다. 연결을 만드는 데 사용 된 기본 코드는 변경되지 않았지만 테스트 및 개발 환경에서 갑자기 쿼리가 실패합니다. 그러나 프로덕션 환경에서 약간 오래된 코드를 사용하여 동일한 서버/데이터베이스에 대해 계속 작동합니다.SQL 연결 강제 종료

web.config에서 연결 시간 초과를 설정하려고했는데 원인을 설명하기가 어려울 수 있습니다.

쿼리의 기본 구조는 다음과 같습니다

Dim conn = New SqlConnection() 
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass" 
conn.Open() 
Using cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "UPDATE ..." 
    cmd.Parameters.AddWithValue("@UName", user.name) 
    cmd.ExecuteNonQuery() 'fails with error 
End Using 

오류 : 나는 IIS와 SQL 서버를 다시 시작 시도하고 내가 아이디어에서 완전히 해요

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

. 난 그냥 수정이 필요해

+0

코드에서 다른 연결 문자열을 사용하는 다른 명령을 실행할 수 있습니까? 즉, 실제 연결 문자열이 작동하는지 확인할 수 있습니까? – DOK

+0

예, 코드는 SMSS 및 웹 응용 프로그램의 다른 부분에서도 작동합니다. – Echilon

답변

1

에서 C:\Program Files\Microsoft SQL Server\<your instance>\MSSQL\LOG

될 것입니다. 그것은 VB.NET에서 끔찍한 특질에 의한 원인으로 밝혀졌습니다. Nullable 날짜 시간은 DateTime.MinValue으로 강제 변환되어 DateTime.MinValue이 SQL datetime에 삽입됩니다. 수정 사항은 명령 매개 변수를 설정할 때 !property.HasValue && property.Value != DateTime.MinValue을 확인하는 것이 었습니다.

+0

연결 오류의 원인을 알지 못함 ...일부 오류가 발생하지만 예상치 못한 오류가 발생할 것으로 예상됩니다. –

+0

그게 정확히 나를 혼란스럽게 만들었지 만, 값을 DBNull.Value로 변경하면 쿼리가 정상적으로 작동합니다. – Echilon

+0

이 결론을 내리기 위해 어떤 단계를 취하셨습니까? – schummbo

2

SqlCommand.ExecuteNonQuery()를 호출하기 전에 연결을 열어야합니다. 이 작업을 수행하려면 SqlConnection.Open()을 호출하십시오.

Dim conn = New SqlConnection() 
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass" 
Using cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "UPDATE ..." 
    cmd.Parameters.AddWithValue("@UName", user.name) 

    conn.Open() 
    cmd.ExecuteNonQuery() 'fails with error 
    conn.Close() 
End Using 

또한 데이터베이스가 단일 사용자 모드가 아닌지 확인하십시오.

+0

죄송합니다, 연결이 열려 있습니다, 실수로 그 라인을 생략했습니다. – Echilon

+0

@Echilon 데이터베이스가 단일 사용자 모드입니까? SSMS를 통해 여러 연결을 시도하십시오. –

0

이것은 네트워크 수준의 오류입니다. 데이터베이스 서버가 어떤 이유로 연결을 종료하고 있습니다. 이 문제를 해결하기 위해 SSMS를 사용하여 DEV 및 TEST 서버에 연결을 열고 간단한 쿼리를 사용할 수 있는지 확인합니다. 타임 아웃이나 다른 종류의 오류가 발생하기 때문에 문제는 라이브러리가 아닐 것입니다.

2

최근에 붙어 있던 다른 사람에게 도움이되었습니다. SQL Server Profiler을 설정하여 데이터베이스 서버에서 문제를 검사 할 수 있습니다.

SQL 프로파일 러에 대한 정보는 인터넷 검색으로 찾아 볼 수 있습니다. 시작하는 데 도움이되는 site with a video입니다. 우선 요청이 데이터베이스 서버에 도달하고 있는지 확인할 수 있습니다.

+0

+1 SQL Trace를 실행하기위한 좋은 제안. –

0

으로 Lcarus는 데이터베이스 서버가 알 수없는 이유로 연결을 종료하고 있다고 말했습니다. 로그를 확인하여 확인할 수 있습니다. 로그 경로는이 추적하는 악몽 MSDN 블로그 MSDN Blog

this will occur when A connection is taken from the connection pool, the application does not know that the physical connection is gone, an attempt to use it is done under the assumption that the physical connection is still there.