Ошибка -2147467259 при подключении к базе данных из VB6 - PullRequest
0 голосов
/ 24 июня 2011

В настоящее время я работаю над небольшим приложением, которое должно подключаться к базе данных. Я делаю это, используя следующий код ...

Set database_connection = New ADODB.Connection
database_connection.ConnectionString = _
 "Driver={MySQL ODBC 3.51 Driver}; Server=HOST; " & _
                              "Database=SCHEMA; " & _
                              "User=USER; " & _
                              "Password=PASSWORD; " & _
                              "Option=3;"
database_connection.Open

Это прекрасно работает, когда я запускаю проект из IDE, и работает с файлом, когда я запускаю скомпилированный exe из командной строки. Если я попытаюсь запустить exe-файл, вызвав функцию CreateProcess, она вообще не будет работать, и появится следующее сообщение об ошибке ...

(1) Error#: -2147467259
Desc. : Unspecified error
Source: Provider
Native Error: -2147467259
SQL State: 
Help Context: 1240640
Help File:

Кто-нибудь знает, что мне с этим делать? Я работаю над Windows XP, и вызов CreateProcess выглядит так ...

Dim create_result As Long
Dim startup_information As STARTUPINFO
Dim our_process_information As PROCESS_INFORMATION
Dim process_attributes As SECURITY_ATTRIBUTES
Dim thread_attributes As SECURITY_ATTRIBUTES

create_result = CreateProcess(vbNullString, _
                              command_line, _
                              process_attributes, _
                              thread_attributes, _
                              0, _
                              0, _
                              0, _
                              vbNullString, _
                              startup_information, _
                              our_process_information)

(Я подозреваю, что проблема с разрешениями, но не знаю, что с этим делать, если она есть. В журнале сервера ничего не появляется.)

1 Ответ

2 голосов
/ 25 июня 2011

Хм, этот стиль кодирования выглядит ужасно знакомым ...

Одна ошибка, которую обычно делают люди, - это использование «стандартных» Declare подписей из таких источников, как API Viewer , не понимая, что они означают, например ::

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" ( _
    ByVal lpApplicationName As String, _
    ByVal lpCommandLine As String, _
    lpProcessAttributes As SECURITY_ATTRIBUTES, _
    lpThreadAttributes As SECURITY_ATTRIBUTES, _
    ByVal bInheritHandles As Long, _
    ByVal dwCreationFlags As Long, _
    lpEnvironment As Any, _
    ByVal lpCurrentDriectory As String, _
    lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long

Эти As String и As Any декларации имеют последствия, которые люди часто игнорируют.

Обычно гораздо, намного лучше использовать точки входа "W" и объявить все указатели как ByVal xxx As Long, а затем применить функции указателя VB6, где это необходимо. Но вы можете привести лошадь к воде ...

Попробуйте это:

create_result = CreateProcess(vbNullString, _
                              command_line, _
                              process_attributes, _
                              thread_attributes, _
                              0, _
                              0, _
                              ByVal 0&, _
                              vbNullString, _
                              startup_information, _
                              our_process_information)

Или, намного лучше, попробуйте:

Private Declare Function CreateProcessW Lib "kernel32" ( _
    ByVal lpApplicationName As Long, _
    ByVal lpCommandLine As Long, _
    ByVal lpProcessAttributes As Long, _
    ByVal lpThreadAttributes As Long, _
    ByVal bInheritHandles As Long, _
    ByVal dwCreationFlags As Long, _
    ByVal lpEnvironment As Long, _
    ByVal lpCurrentDriectory As Long, _
    ByVal lpStartupInfo As Long, _
    ByVal lpProcessInformation As Long) As Long

Dim create_result As Long
Dim startup_information As STARTUPINFO
Dim our_process_information As PROCESS_INFORMATION

create_result = CreateProcessW(0, _
                               StrPtr(command_line), _
                               0, _
                               0, _
                               0, _
                               0, _
                               0, _
                               0, _
                               VarPtr(startup_information), _
                               VarPtr(our_process_information))

Я предполагаю, что именно здесь вы "ломали" свой драйвер ODBC (к сожалению, поставщик OLEDB был бы намного лучше, но я не знаю достойного бесплатного для MySQL).

О, проблема (и разница здесь)?

Вы сбрасывали блок среды в ничто, т. Е., Возможно, нарушение PATH не позволяет вашему драйверу ODBC работать.

Нулевые указатели, нули и пустые структуры - это совершенно разные вещи.

...