2009-05-08 13 views
1

VB6プログラミングには新しくないが、私はそれをマスターしていない。うまくいけば、関数から返されたintを使ってint変数を設定しようとしたときに受け取った型の不一致エラーに関して、誰かが私に助けてくれることを願っています。VB6:ランタイムエラー '13':intでint型を設定すると型が一致しない

私が設定しようとしている整数は次のように定義されています

Global AICROSSDOCKStatus As Integer 

今、私はこの呼び出しを作るしようとしたとき、私はランタイムエラー13

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

を取得し、私はを通じて段階ました行のプログラム行をデバッグします。 ProcessQuery関数は期待される整数を取得して返しますが、AICROSSDOCKStatusに代入を行うと失敗します。

また、私は同じ結果を持つProcessQueryに対してCInt()を実行しようとしました。

私は何を試すことができるかもしれないのですか?

編集:ここでは はProcessQuery

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

編集2の定義は次のとおりです。これは、このように行われていた私はなぜあなたを伝えることができませんでした。私はコードベースを継承しました。ローカルに定義された整数は、まず、ローカル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

問題は、関数からの戻り値ではなく、参照渡しされたパラメータに問題があったというわけではありません。参考までに渡すためにRecordset(鉛)が必要でしたが、私はレコードとして宣言しました(鉛)。

1

まあ、私は私が壊す何を知っているが、ここで可能なデバッグステップだと言うことはできません。実行時エラー13が最初の割り当てで発生した場合、本当に奇妙なことが起きています。もしそれが2番目に発生した場合は、グローバル変数のいずれかが境界を越えている可能性のある配列であるかどうかを確認することができます。

幸運を祈る!

1

msgbox ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "")を試してみて、値がintであるかどうかを確認してください。

私はそれが失敗した結果である&ではないと確信しています。私の推測では、数字以外の値になる文字が来るでしょう。

結果にIsNumeric関数を使用して、数値であるかどうかを調べることができます。

1

あなたの関数から何らかの種類の型を取る中間のVariantを使ってみてください。少なくとも、戻り値の実際の型を調べることができます。 intにProcessQuery()関数を閉じ込める

MsgBox TypeName(ProcessQuery(...)) 

は、最初からこのようなエラーを防ぐために、どのような場合に役立つかもしれない:

1

これはあなたの関数が実際に戻っているあなたのタイプの名前を教えてくれます

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

ProcessQuery1でProcessQueryでこれを試してみると、予想される 'Integer'が得られます。 TypeName(ProcessQuery(...))を試すと、エラーが発生します。 – Chris

+0

それから* ProcessQuery1()内でエラーが発生したと思います。 「On Error Goto」ステートメントのコメントを外して、その場所を確認します。ちなみに、関数ProcessQuery1()は...かなり混乱しています。タイプミスマッチは、それが持つ唯一の問題ではありません。 – Tomalak

+0

問題があることについて冗談を言っているわけではありません。 ProcessQuery1を使用して作成しましたが、ProcessQueryで 'End Function'に達したときにエラーが発生します。 – Chris

1

APIがVB6整数(16ビット数)を返すのは少し珍しいことです。かなりの頻度で、C関数のプロトタイプを翻訳している人は、VB6のIntegerとVB6 Integerを混同してしまいます。

関連する問題