2010-06-30 2 views
0

하나의 데이터베이스를 다른 데이터베이스로 변환하는 응용 프로그램이 있으며 사용하는 함수 중 하나가 아래의 insert_Note입니다. 이 응용 프로그램은 새로운 데이터베이스에 다른 데이터를 삽입하는 다중 스레드를 가지고 있습니다. 아래의 코드는 24에서 120 사이의 여러 삽입에 대해 작동하지만 오류로 인해 실패합니다.INSERT에 열 수가 적습니다. 응답이 아닙니다.

VALUES 절에 지정된 값보다 INSERT 문의 열 수가 적습니다. VALUES 절의 값 수는 INSERT 문에 지정된 열 수와 일치해야합니다.

코드를 보면 삽입이 아닌 일부 코드에서만 코드가 작동하기 때문에 문제가 될 수 있습니다. 멀티 스레드 응용 프로그램에서이 오류가 발생할 수있는 원인은 무엇입니까? 내가 3 일을 보냈고 어떤 곳도 얻지 못했기 때문에 어떤 아이디어라도 환영받을 것이다!

*Public sub insert_Note 
    Dim sql As String 
    Dim cmd As New SqlClient.SqlCommand 
    sql = "INSERT INTO notes (" 
    sql &= "RefID," 
    sql &= "TypeID," 
    sql &= "DateEntered," 
    sql &= "Username," 
    sql &= "Subject," 
    sql &= "Body," 
    sql &= "DoNotSendToWeb," 
    sql &= "Deleted," 
    sql &= "SubTypeID" 
    sql &= ") VALUES (" 
    sql &= "@RefID," 
    sql &= "@TypeID," 
    sql &= "@DateEntered," 
    sql &= "@Username," 
    sql &= "@Subject," 
    sql &= "@Body," 
    sql &= "@DoNotSendToWeb," 
    sql &= "@Deleted," 
    sql &= "@SubTypeID" 
    sql &= ")" 
    cmd.CommandText = sql 
    cmd.Parameters.AddWithValue("@RefID", 0) 
    cmd.Parameters.AddWithValue("@TypeID", 0) 
    cmd.Parameters.AddWithValue("@DateEntered", DBNull.Value) 
    cmd.Parameters.AddWithValue("@Username", DBNull.Value) 
    cmd.Parameters.AddWithValue("@Subject", DBNull.Value) 
    cmd.Parameters.AddWithValue("@Body", DBNull.Value) 
    cmd.Parameters.AddWithValue("@DoNotSendToWeb", DBNull.Value) 
    cmd.Parameters.AddWithValue("@Deleted", DBNull.Value) 
    cmd.Parameters.AddWithValue("@SubTypeID", DBNull.Value) 
    Using DotNetdatabase As New DBAccessLayer.DBAccessLayer(VBDotNetConn) 
     Try 
      Dim ds As DataSet 
      ds = DotNetdatabase.OpenDataSetWithoutErrorMsg(cmd) 
      Return (0) 
     Catch ex As Exception 
     AddToErrorLog(ex.Message, "Adding Note") 
      Throw ex 
     End Try 
    End Using 
End Function 

public class DBAccessLayer 
    private myConnection as SqlConnection 
    Public Sub New(ByVal strConnectionString As String) 
      myConnection = New SqlConnection(strConnectionString) 
    End Sub 
    Public Function OpenDataSetWithoutErrorMsg(ByVal myCommand As SqlCommand) As DataSet 
      Dim MyDataSet As New DataSet 
      Dim myDataAdapter As SqlDataAdapter 
      Try 
       Dim blnInitiallyOpen As Boolean = True 

        myConnection.Open() 
        Do Until myConnection.State = ConnectionState.Open 
          Threading.Thread.Sleep(100) 
        Loop 

        myCommand.CommandTimeout = 0 
        myCommand.Connection = myConnection 
        myDataAdapter = New SqlDataAdapter(myCommand) 
        myDataAdapter.Fill(MyDataSet) 

        myConnection.Close() 

        Return MyDataSet 
      Catch e As Exception 
        If myConnection.State = ConnectionState.Open Then 
         myConnection.Close() 
        End If 
        Throw e 
        Return Nothing 
       End Try 
    End Function 
end class* 

감사합니다,

휴 knowlege은 우리가 그들을 해결할 수는 무지없는 문제를 야기 할 수 있습니다.

아이작 아시모프 (Isaac Asimov)

+1

어디에서 오류가 발생합니까? 'VB' 오류 스택 추적을 게시 할 수 있습니까? – Quassnoi

+0

@ 휴 : ID 열이 있습니까? –

+0

그리고 항상 테이블에 동일한 값을 삽입했음을 확인할 수 있습니까? (모두 0, DBNULL은 코드 당 정확히 동일합니다)? 즉 param 값이 실제로 다른 곳에서 나온 것이 아닙니다 – AdaTheDev

답변

3

휴 :

나는이 문제를 해결 갈 수있는 방법을

: 당신의 캐치에서

1), 특히 삽입 적은 열 관한 오류를 잡을 수있어. 그런 다음 명령 텍스트와 매개 변수 값을 기록하거나 수동으로 조사하십시오. 거기에 문제가 표시되지 않으면 해당 로깅 결과를 질문에 게시하십시오. 문제를 보았다면 내 대답을 선택하십시오 :) -> 궁금합니다. @Body 같은 매개 변수가 null 대신 빈 문자열이되면 어떨까요? insert 문은 어떻게 생겼을까요?

2) 저는 DB 프로그래머입니다. 이 코드는 저장 프로 시저에 속합니다. 훨씬 쉽게 디버깅 할 수 있습니다.

3) 발생 범위를 데이터 집합으로 좁힐 수 있었습니까?

4) Yellowfog의 논리를 따라 가십시오 - 트리거가 있거나 중요하게도 - 연결을 따라 실행되는 다른 코드가 있습니다 - 오류가 발생했을 수도있는 순서대로 발생하지만 한때 어디에서든지 버블 링되었습니다 당신은 그것이이 코드 인 것처럼 보이는 것을보고 있습니까? 나는 종종 코드 조각이 특별한 예외를 일으킬 수 없다는 것을 확신 할 때, 나는 맞다. 나는 잘못된 코드를보고있다.

5) 실제로 실행중인 명령문을 보려면 SQL Server 프로파일 러를 사용하십시오. 추가 할 이벤트는 다음과 같습니다. TSQL-SQL : StmtCompleted & SQL : StmtStarting, 오류 및 경고 : 모두. 가능한 한 적은 트래픽으로 상자에서 이렇게하는 것이 가장 쉽습니다. 이 page을 시작하면 도움이 될 것입니다.

+0

+1 이것은 저장 프로 시저에 속하는 주석입니다. – Josaph

+0

응답 해 주셔서 감사합니다. 나는이 문제를 최종적으로 해결했다. 관련이없는 SQL 문에서 쉼표가 누락되었습니다. 나는 오류 처리기가 응용 프로그램이 멀티 스레드되어 오류가 잘못된 위치에 던져 버렸기 때문에 오류 처리기가 섞여 있다고 생각합니다. 따라서 버그를 추적하는 데 3 일이 걸렸습니다. –

+0

@hugh again - 또 다른 중요한 설명 - 이것은 전략의 주요 후보처럼 보입니다. (a) 다른 데이터베이스의 테이블을 가리키는 하나의 데이터베이스에 연결된/링크 된 테이블을 생성하십시오. (b) 두 테이블을 모두 볼 수있는 db에서 OldTable의 INSERT INTO NewTable ... SELECT ... 구문을 사용합니다. 열 이름을 나열하십시오. DBMS는 인덱스 생성, 데이터 전송 등을 최적화 할 것입니다. 특히 많은 양의 데이터가 있다면, 당신은 죽었고 천국에 갔다고 생각할 것입니다. – FastAl

관련 문제