VB6: ошибка времени выполнения '13': несоответствие типов при установке и int с int - PullRequest
1 голос
/ 08 мая 2009

Я не новичок в программировании на VB6, но я не мастер в этом тоже. Надеюсь, кто-то может помочь мне с вопросом, который у меня возник, относительно ошибки несоответствия типов, которую я получаю при попытке установить переменную int с возвращаемым из функции int.

Целое число, которое я пытаюсь установить, определяется как:

Global AICROSSDOCKStatus As Integer

Теперь, когда я пытаюсь сделать этот вызов, я получаю сообщение об ошибке 13

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

Я прошел отладку строки программы для строки. Функция ProcessQuery получает и возвращает ожидаемое целое число, но когда присваивание AICROSSDOCKStatus должно быть выполнено, происходит сбой.

В дополнение к этому, я также попытался сделать CInt () для ProcessQuery с тем же результатом.

У кого-нибудь есть предложения по поводу того, что я могу попробовать?

Edit: Вот определение ProcessQuery

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

Редактировать 2: Я не мог сказать вам, почему это было сделано таким образом. Я унаследовал кодовую базу. Хлоп ...


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

Ответы [ 6 ]

1 голос
/ 09 мая 2009

Проблема была не в том, что у него были проблемы с возвратами из функции, а в параметрах, которые передавались по ссылке. Мне нужно было передать набор записей (pb) по ссылке, но я объявил (pb) как запись.

1 голос
/ 08 мая 2009

Это немного необычно для API возвращать целое число VB6, которое является 16-битной величиной. Довольно часто кто-то, переводящий прототип функции C, будет путать c "int" с VB6 Integer, когда в VB6 эквивалент действительно Long.

1 голос
/ 08 мая 2009

Это скажет вам имя типа, который ваша функция фактически возвращает:

MsgBox TypeName(ProcessQuery(...)) 

Установка функции ProcessQuery () на int может быть полезной в любом случае, чтобы предотвратить такие ошибки с самого начала:

Function ProcessQuery(whatever arguments) As Integer
  ''// ...
End Function
1 голос
/ 08 мая 2009

Попробуйте использовать промежуточный вариант, который должен принимать любой тип из вашей функции. Это должно как минимум позволить вам исследовать реальный тип возвращаемого значения.

1 голос
/ 08 мая 2009

Попробуйте msgbox ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "") и посмотрите, не окажется ли значение целым числом?

Я уверен, что это не будет int, и это результат, который он терпит неудачу. Я предполагаю, что это будут символы, которые делают его не числовым значением.

Вы можете попробовать функцию IsNumeric на результатах, чтобы проверить, является ли это числовым значением.

1 голос
/ 08 мая 2009

Ну, я не могу сказать, что знаю, что ломается, но вот возможный шаг отладки: сначала назначьте локально определенное целое число, а затем присвойте AICROSSDOCKStatus локальному int. Если во время первого присваивания возникает ошибка 13 времени выполнения, что-то ДЕЙСТВИТЕЛЬНО странное происходит - если это происходит во время второго, то вы можете захотеть посмотреть, являются ли какие-либо из ваших глобальных переменных массивами, для которых вы можете выходить за границы.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...