2009-05-08 9 views
1

VB6 프로그래밍에 익숙하지 않지만 마스터가 아닙니다. 잘만되면 누군가가 함수에서 반환 된 int 변수를 설정하려고 시도 할 때받는 형식 불일치 오류와 관련하여 질문에 대한 도움을받을 수 있기를 바랍니다.VB6 : 런타임 오류 '13': int로 설정할 때 형식이 일치하지 않습니다.

내가 설정하는 데 노력하고있어 정수로 정의된다

:

Global AICROSSDOCKStatus As Integer 

지금은 내가 통해 강화했습니다 (13)

AICROSSDOCKStatus = ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "") 

런타임 오류를 얻을이 전화를하려고 할 때 줄 프로그램 줄 디버깅. ProcessQuery 함수는 예상 된 정수를 가져오고 반환하지만 AICROSSDOCKStatus에 할당 할 때 실패합니다.

또한 동일한 결과로 ProcessQuery에 대한 CInt() 작업도 시도해 보았습니다.

누구에게 내가 시도 할 수있는 제안이 있습니까?

편집

: 여기 편집 2
Function ProcessQuery(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer 

ProcessQuery

의 정의입니다 :이이 방식으로 이루어졌다 내가 왜 당신을 말할 수 없었다. 나는 코드베이스를 물려 받았다. 로컬로 정의 된 정수 먼저, 다음 로컬 INT에 AICROSSDOCKStatus를 할당 지정 : 이궁 ...


Function ProcessQuery(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer 
    ProcessQuery = ProcessQuery1(icode, pb, TableName, sql$) 
End Function 

Function ProcessQuery1(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer 
''THIS IS THE ORIGINAL SQL CALL ROUTINE! 
Dim STATUS As Integer 
On Error GoTo ProcessSQLError 

STATUS = 0 
Select Case icode 
    Case BCLOSE 
     If pb.State 0 Then 
      pb.Close 
     End If 
     Set pb = Nothing 
     STATUS = 3 
    Case BOPEN 
     STATUS = 9 
     Set pb = New ADODB.Recordset 
    Case BOPENRO 
     STATUS = 9 
     Set pb = New ADODB.Recordset 
    Case BGETEQUAL, BGETEQUAL + S_NOWAIT_LOCK, BGETGREATEROREQUAL, BGETGREATEROREQUAL + S_NOWAIT_LOCK 
     If pb.State 0 Then 
      pb.Close 
      ''Set pb = Nothing 
      ''Set pb = New ADODB.Recordset 
     End If 
     pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic 
     If Not pb.EOF Then 
      pb.MoveFirst 
     Else 
      STATUS = 9 
     End If 
    Case BGET_LE, BGET_LE + S_NOWAIT_LOCK 
     If pb.State 0 Then 
      pb.Close 
     End If 
     pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic 
     If Not pb.BOF Then 
      pb.MoveLast 

     Else 
      STATUS = 9 
     End If 
    Case BGETFIRST, BGETFIRST + S_NOWAIT_LOCK 
     If pb.State 0 Then pb.Close 
     sql = "select * from " + TableName 
     If InStr(1, gblOrderBy, "ORDER BY") > 0 Then 
      sql = sql + gblOrderBy 
     Else 
      sql = sql + " ORDER BY " + gblOrderBy 
     End If 

     gblOrderBy = "" 
     pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic 
     If Not pb.EOF Then 
                 pb.MoveFirst 
     End If 
    Case BGETLAST, BGETLAST + S_NOWAIT_LOCK 
     If pb.State 0 Then 
      pb.Close 
     End If 
     sql = "select * from " + TableName 
     If InStr(1, gblOrderBy, "ORDER BY") > 0 Then 
      sql = sql + gblOrderBy 
     Else 
      sql = sql + " ORDER BY " + gblOrderBy 
     End If 
     gblOrderBy = "" 
     pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic 
     If Not pb.EOF Then 
      pb.MoveFirst 
      pb.MoveLast 
     End If 
    Case BGETNEXT, BGETNEXT + S_NOWAIT_LOCK:   pb.MoveNext 
    Case BGETPREVIOUS, BGETPREVIOUS + S_NOWAIT_LOCK: pb.MovePrevious 
    Case B_UNLOCK 
     ''need to add code here 
    Case BINSERT 
     If pb.State = 0 Then 
      pb.Open TableName, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic 
     End If 
    Case BDELETE 
     STATUS = 8 
     pb.Delete 
    Case Else 
     STATUS = 1 
     MsgBox "STOP: UNDEFINDED PROCEDURE" + Str$(icode) 
End Select 
If STATUS = 0 Then 
    If pb.EOF Or pb.BOF Then STATUS = 9 
End If 

ProcessQuery1 = STATUS 
Exit Function 

ProcessSQLError: 
    MsgBox TableName + ": " + Error(Err), vbCritical, "Error " 
    ProcessQuery1 = 9 

End Function 
+0

ProcessQuery의 정의를 게시 할 수 있습니까? –

+0

서명이 아닌 ProcessQuery의 전체 코드를 게시 할 수 있습니까? – MarkJ

+1

와우. 어떤 사람들은 유지 보수 프로그래머가 살고있는 곳을 알고있는 폭력적인 정신병자 인 경우를 지정합니다. 다른 사람들은 관리자를 폭력적인 정신병자로 변화시키는 코드를 작성합니다. ProcessQuery1은 두 번째 학교의 제품입니다. – MarkJ

답변

1

문제는 함수에서 반환하는 것이 문제가 아니지만 참조로 전달 된 매개 변수입니다. 참조로 전달할 레코드 세트 (pb)가 필요했지만 레코드로 선언했습니다.

1

글쎄, 난 깨고 것을 알고 있지만, 여기에 가능한 디버깅 단계 말할 수 없습니다. 첫 번째 할당에서 런타임 오류 13이 발생하면 정말 이상한 일이 발생합니다. 두 번째 일이 발생하면 전역 변수 중 하나가 경계를 초과 할 수있는 배열인지 확인해야 할 수 있습니다.

행운을 빈다.

1

msgbox ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "")을 시도해보고 값이 int인지 확인하십시오.

나는 그것이 실패한 결과 인 &이 아닐 것이라고 확신합니다. 내 추측으로는 문자가 아닌 숫자 값이되는 문자가 올 것입니다.

결과에 IsNumeric 함수를 사용하여 숫자 값인지 확인할 수 있습니다.

1

중간 변형을 사용하여 시도하십시오.이 변형은 사용자의 기능에서 어떤 종류의 유형을 취해야합니다. 최소한 리턴 값의 실제 유형을 조사 할 수 있어야합니다.

MsgBox TypeName(ProcessQuery(...)) 

처음부터 이러한 오류를 방지하기 위해, 어떤 경우에 도움이 될 수 int로하는 ProcessQuery() 함수를 한정시키기 :

1

이 함수가 실제로 반환 당신에게 유형의 이름을 말할 것이다 :

Function ProcessQuery(whatever arguments) As Integer 
    ''// ... 
End Function 
+0

ProcessQuery1에서 ProcessQuery에서이 작업을 시도하면 예상되는 '정수'를 얻습니다. TypeName (ProcessQuery (...)) 시도 할 때 오류가 발생합니다. – Chris

+0

그런 다음 오류가 * ProcessQuery1() 내에 발생합니다. "On Error Goto"문장의 주석 처리를 제거하여 그 문장의 위치를 ​​확인하십시오. 그건 그렇고, ProcessQuery1() 함수는 ... 다소 혼란 스럽습니다. 유형 불일치가 유일한 문제는 아닙니다. – Tomalak

+0

문제가 있다고 농담하지 않습니까? ProcessQuery1을 통해 처리 했으므로 ProcessQuery에서 'End Function'에 도달하면 오류가 발생합니다. – Chris

1

API가 16 비트 양인 VB6 Integer를 반환하는 경우는 드뭅니다. 대체로 C 함수 프로토 타입을 번역하는 사람은 VB6에서 Long이 실제로 Long 일 때 c "int"와 VB6 Integer를 혼동합니다.

관련 문제