2010-01-08 2 views
0

У меня есть большая программа 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, и я все еще получаю сообщение об ошибке.

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

ответ

0
Редакция:

Редактировать: при просмотре кода я замечаю, что исходное соединение 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 
    ... 
+0

соединение Cn объявлен как Public Только до вызова хранимой процедуры я проверил состояние Сп и он открыт. – Jan

+0

Отредактировано ответ - строки подключения для двух соединений различны, и это может быть проблемой. – barrowc

+0

Вы правы. Cn делает свое соединение тем, как в двухэтапном процессе просматривает имя пользователя и их роли для предоставления привилегий таблицам. Второе соединение делает прямое соединение в одном процессе с использованием «общего» имени пользователя, а не имени пользователя. Босс согласился использовать второе соединение. Использование второго соединения будет не часто, и время, в течение которого он будет открыт, будет очень коротким. Спасибо за внимание к моему вопросу !! – Jan