Драйвер Microsoft ODBC для ошибки синтаксиса Oracle или нарушения прав доступа (-2147217900) - PullRequest
0 голосов
/ 08 января 2010

У меня есть большая программа VB, которая подключается к базе данных Oracle.

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

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

В моей программе много пользователей, поэтому у меня есть таблица, в которой содержится логин каждого пользователя и его права доступа к различным таблицам. Когда я запускаю программу, я создаю набор записей для всех пользователей, а затем выбираю USERNAME и GRANTED_ROLE из набора записей, где находятся USERNAME и PASSWORD. Я использую «Установить роль« GRANTED_ROLE », идентифицируемую паролем» и оператором Cn.Execute, чтобы установить права доступа пользователя. Все это делается в модуле.

В форме я хочу вызвать хранимую процедуру, которая будет ВЫБРАТЬ, ВСТАВЛЯТЬ и ОБНОВЛЯТЬ информацию в таблицы другой схемы. Я могу вызвать и запустить хранимую процедуру, когда создаю новое соединение с базой данных с этим кодом:

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

Set conn5040 = Новый ADODB.Connection conn5040 = "Драйвер = {Microsoft ODBC для Oracle};" & _ «SERVER = PSPROD; UID = XXXXXXX; PWD = XXXXXXXX» conn5040.Open

Set 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.Execute conn5040.Close

Однако я получаю сообщение об ошибке «-2147217900 [Microsoft] [драйвер ODCB для Oracle] Синтаксическая ошибка или нарушение доступа», когда я пытаюсь использовать то же соединение («Cn») при первом запуске программы. Мой код:

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

Set 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

Я работал с моим администратором базы данных. Она дала мне прямые права и привилегии прямого исполнения, и я все еще получаю сообщение об ошибке.

Что я делаю не так? Можно ли использовать исходное соединение для запуска хранимой процедуры? Или я должен создать второе соединение?

1 Ответ

0 голосов
/ 09 января 2010

edit: при просмотре вашего кода я замечаю, что исходное соединение Cn указывает драйвер и имя сервера, тогда как второе соединение conn5040 указывает драйвер, имя сервера, пользователя и пароль.

Таким образом, может случиться так, что для хранимой процедуры, которую вы вызываете, требуются пользователь и пароль, которые в исходном cn подключении не указаны


Оригинальный ответ:

Убедитесь, что переменная cn все еще находится в области видимости, когда вы пытаетесь ее использовать. Если он объявлен в модуле, то он должен быть объявлен вне любого Sub или Function, и, если другие модули должны иметь доступ к нему, он должен быть объявлен как Public

Option Explicit

Public cn as ADODB.Connection

Sub foo()
...

Предполагая, что cn все еще находится в области видимости, вы можете проверить свойство State объекта, на которое ссылается cn, чтобы убедиться, что Connection все еще открыт.

If (cn.State = adStateClosed) Then
    ' we have a problem
    ...
...