2011-06-24 27 views
0

現在、データベースに接続する必要がある小さなアプリケーションを作成しています。私は...これは、次のコードを使用して行うエラー-2147467259 VB6からデータベースに接続

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ファイルを実行すると、それはファイルを動作します。私はCreateProcess関数を呼び出すことによってexeファイルを実行しようとすると、しかし、それは、次のエラーメッセージを生成する、まったく動作しない...誰もが私はこれをどうするべき

(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) 

を探します(私はアクセス権の問題があると思われるが、それはある場合はそれについて何をするか分からない。何がサーバーに表示されていませんログインします。)

+0

アプリケーションが実行されているマシンのイベントビューアのアプリケーションおよびセキュリティノードでエラーを探してみてください。 – jac

+0

これは私が見た中で最も美しいエラー番号です。 – DeaconDesperado

+1

'-2147467259'は' 0x80004005'です。これは一般的な "アクセス拒否"タイプのエラーメッセージです – ChrisF

答えて

2

うーん、コーディングスタイルはとても見慣れ...

1つのミスの人々は一般的に例えば、彼らが何を意味するか理解せずに、このようなAPIビューアなどのソースから「ストック」Declare署名を使用されていることを確認していること:

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および宣言は、人々が無視することが多い影響を与えます。

一般に、「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ドライバが機能しなくなる可能性があります。

ヌルポインタ、ゼロ、空の構造は全く異なるものです。

+0

そして、ここでは何もしていないと言えますが、VB6のシェル() 関数。 – Bob77

+0

ありがとうございました。今すぐ華麗にボウリングしています。私はCreateProcessを使用していました。なぜなら、プロセスIDを必要としていたからです。おそらく私はしません。私はVMSの男性です。 –

関連する問題