0

Oracle データベースに接続する大規模な VB プログラムがあります。

strCn = "Driver={Microsoft ODBC for Oracle};" & _
        "SERVER=PSPROD;"

Set Cn = New ADODB.Connection
Cn.ConnectionString = strCn
Cn.CursorLocation = adUseNone
Cn.Open

私のプログラムには多くのユーザーがいるので、各ユーザーのログイン名とさまざまなテーブルへのアクセス権を含むテーブルがあります。プログラムの起動時にすべてのユーザーのレコードセットを作成し、USERNAME と PASSWORD が含まれているレコード セットから USERNAME と GRANTED_ROLE を選択します。「'password' で識別されるロール 'GRANTED_ROLE' を設定する」ステートメントと Cn.Execute ステートメントを使用して、ユーザーのアクセス権を設定します。これはすべてモジュールで行われます。

フォーム上で、SELECT、INSERT、および UPDATE 情報を別のスキーマのテーブルに格納するストアド プロシージャを呼び出したいと考えています。次のコードを使用してデータベースへの新しい接続を作成すると、ストアド プロシージャを呼び出して実行できます。

Dim cmd5040 As ADODB.Command Dim conn5040 As ADODB.Connection Dim param5040 As ADODB.Parameter

conn5040 = New ADODB.Connection conn5040 = "Driver={Microsoft ODBC for Oracle};" を設定します。& _ "サーバー=PSPROD; UID=XXXXXXX; PWD=XXXXXXXX" conn5040.Open

cmd5040 を設定 = 新しい ADODB.Command

cmd5040 .ActiveConnection = conn5040 .CommandType = adCmdStoredProc .CommandText = "S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime" を使用

.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5)
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400)

で終わる

cmd5040(0) = 0 cmd5040(1) = "" cmd5040.CommandTimeout = 300

cmd5040.conn5040.Close を実行

ただし、プログラムの最初の起動時に同じ接続 ('Cn') を使用しようとすると、「-2147217900 [Microsoft][ODCB driver for Oracle]Syntax error or access violation」というエラー メッセージが表示されます。私のコードは次のとおりです。

Dim cmd5040 As ADODB.Command Dim param5040 As ADODB.Parameter

cmd5040 を設定 = 新しい ADODB.Command

cmd5040 で .ActiveConnection = Cn .CommandType = adCmdStoredProc .CommandText = "S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime"

.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5)
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400)

で終わる

cmd5040(0) = 0 cmd5040(1) = ""

cmd5040.Execute

私はDBAと協力してきました。彼女は私に直接許可と直接実行権限を与えてくれましたが、まだエラー メッセージが表示されます。

私は何を間違っていますか?元の接続を使用してストアド プロシージャを実行できるようにする必要がありますか? または、2 つ目の接続を作成する必要がありますか?

4

1 に答える 1

0

編集:コードを確認すると、元の接続Cnではドライバーとサーバー名が指定されているのに対し、2 番目の接続conn5040ではドライバー、サーバー名、ユーザー、およびパスワードが指定されていることがわかります。

したがって、呼び出しているストアド プロシージャには、元のcn接続で指定されていないユーザーとパスワードが必要な場合があります。


元の答え:

変数を使用するときは、変数cnがまだスコープ内にあることを確認してください。Subモジュールで宣言されている場合は、任意のorの外側で宣言する必要がありますFunction。また、他のモジュールがそれにアクセスできる必要がある場合は、次のように宣言する必要があります。Public

Option Explicit

Public cn as ADODB.Connection

Sub foo()
...

それがまだスコープ内にあると仮定すると、オブジェクトがまだ開いているかどうかを参照するオブジェクトのStateプロパティをcn調べることができます。cnConnection

If (cn.State = adStateClosed) Then
    ' we have a problem
    ...
于 2010-01-09T03:55:56.443 に答える