У меня есть большая программа VB, которая подключается к базе данных Oracle.Microsoft ODBC драйвер для Oracle Синтаксис ошибка или нарушение доступа (-2147217900)
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, идентифицированную по статусу «password» и «Cn.Execute», чтобы настроить права доступа пользователя. Все это делается в модуле.
В форме, я хочу вызвать хранимую процедуру, которая будет отображать информацию в других таблицах схемы, которая будет SELECT, INSERT и UPDATE. Я могу позвонить и запустить хранимую процедуру при создании нового подключения к базе данных с помощью этого кода:
Dim cmd5040 Как ADODB.Command Dim conn5040 Как ADODB.Connection Dim param5040 Как ADODB.Parameter
Set conn5040 = Новый ADODB.Connection conn5040 = "Driver = {Microsoft ODBC for 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)
End With
cmd5040 (0) = 0 cmd5040 (1) = "" cmd5040.CommandTimeout = 300
cmd5040.Execute conn5040.Close
Однако я получаю сообщение об ошибке «-2147217900 [Microsoft] [ ODCB для Oracle] Синтаксическая ошибка или нарушение прав доступа ", когда я пытаюсь использовать одно и то же соединение ('Cn'), когда программа запускается впервые. Мой код:
Dim cmd5040 Как ADODB.Command Dim param5040 Как 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)
End With
cmd5040 (0) = 0 cmd5040 (1) = ""
cmd5040.Execute
Я работал с моим DBA. Она дала мне прямые гранты и прямо исполняла privliges, и я все еще получаю сообщение об ошибке.
Что я делаю неправильно? Должен ли я использовать исходное соединение для запуска хранимой процедуры? Или мне нужно создать второе соединение?
соединение Cn объявлен как Public Только до вызова хранимой процедуры я проверил состояние Сп и он открыт. – Jan
Отредактировано ответ - строки подключения для двух соединений различны, и это может быть проблемой. – barrowc
Вы правы. Cn делает свое соединение тем, как в двухэтапном процессе просматривает имя пользователя и их роли для предоставления привилегий таблицам. Второе соединение делает прямое соединение в одном процессе с использованием «общего» имени пользователя, а не имени пользователя. Босс согласился использовать второе соединение. Использование второго соединения будет не часто, и время, в течение которого он будет открыт, будет очень коротким. Спасибо за внимание к моему вопросу !! – Jan