Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2019, 14:54   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Параметризированный запрос к БД Oracl из VBA.

Добрый день. Пытаюсь отладить запись с параметрами из VBA под Outlook в БД Oracle.
Запрос на выборку данных проходит
Код:
'Dim cn As ADODB.connection
    'Dim rs As ADODB.Recordset
    Dim cn As Object
    Dim rs As Object
Dim strSql As String

    'Set cn = New ADODB.connection
    'Set rs = New ADODB.Recordset
            
    Set cn = CreateObject("ADODB.connection")
    Set rs = CreateObject("ADODB.Recordset")
            
    cn.ConnectionString = "Provider=OraOLEDB.oracle;USER ID=star;Password=star;Data Source=root"
    
    
    cn.Open 'ñäåëàòü ïîòîì îáðàáîòêó îøèáêè ïîäêëþ÷åíèÿ
    
    strSql = "select * from IZMIRAN"
    rs.Open strSql, cn, 3, 3
    
    rs.MoveFirst
    
    
    Do While Not rs.EOF
        MsgBox rs("NAME_F") & " " & rs("N_MES")
        rs.MoveNext
    
    Loop
    
    rs.Close
    cn.Close
А запись - ни в какую. Что только не пробовал. И символьные параметры, и знаки вопросов.

Код:
Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    
    MsgBox "first"
    
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    
    strSql = "insert into izmiran(N_MES) values(@nmes)"
    
    
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    
    
    
    con.Open
    
  MsgBox "tata"
    
    Set oCmd = CreateObject("ADODB.Command")

    MsgBox "tata2"
    oCmd.ActiveConnection = con
    
 
    
    oCmd.CommandText = sql
    
    MsgBox "qwerty2"
    
    oCmd.CommandType = 1

    'oCmd.NamedParameters = True
    
    MsgBox "qwerty3"
    
    
    oCmd.Parameters.Append oCmd.CreateParameter("N_MES", adNumeric, adParamInput, 8, 897)
    
    MsgBox "qwerty4"
    
    oCmd.Prepared = True
    'oCmd. = 15
    
    
    
    oCmd.Execute
    
    MsgBox "qwerty5"
    
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
oCmd.Execute – не проходит. Что я делаю не так?
ivan.tiran вне форума Ответить с цитированием
Старый 20.08.2019, 15:35   #2
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Тут конечно есть ошибки. Уже в который раз лопачу код.
Вот новый вариант.

Код:
Private Sub WriteInIzmiran(databaseName As String, databaseUser As String, databaseUserPassword As String)  'ïðîöåäóðà çàïèñè âëîæåíèé â Izmiran Item As Outlook.MailItem, hType As HeaderType, workDirectory As String,
    Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    
    MsgBox "first"
    
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    
    strSql = "insert into izmiran(N_MES) values(?)"
    
    
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    
    
    
    con.Open
    
  MsgBox "tata"
    
    Set oCmd = CreateObject("ADODB.Command")

    MsgBox "tata2"
    oCmd.ActiveConnection = con
    
 
    
    oCmd.CommandText = sql
    
    MsgBox "qwerty2"
    
    oCmd.CommandType = adCmdStoredProc

    oCmd.NamedParameters = False
    
    MsgBox "qwerty3"
    
    oCmd.Parameters.Refresh
    oCmd.Parameters.Append oCmd.CreateParameter("N_MES", adInteger, adParamInput, , 897)
    
    oCmd.Prepared = True
    'oCmd. = 15
    
    MsgBox "qwerty4"
    
    oCmd.Execute
    
    MsgBox "qwerty5"
    
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
    
    
End Sub
Почему не работает?
ivan.tiran вне форума Ответить с цитированием
Старый 20.08.2019, 15:57   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

"@N_MES" - не ? и если добавлять параметры, то refresh по-моему не нужен
или
oCmd.Parameters.Item(1).Value = 897 а так refresh перед присвоением значений нужен
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.08.2019 в 15:59.
Аватар вне форума Ответить с цитированием
Старый 20.08.2019, 16:23   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
"@N_MES" - не ? и если добавлять параметры, то refresh по-моему не нужен
или
oCmd.Parameters.Item(1).Value = 897 а так refresh перед присвоением значений нужен
Что тогда я в этот раз не так делаю?
qwerty4 вообще не выводится

Код:
Private Sub WriteInIzmiran(databaseName As String, databaseUser As String, databaseUserPassword As String)  'ïðîöåäóðà çàïèñè âëîæåíèé â Izmiran Item As Outlook.MailItem, hType As HeaderType, workDirectory As String,
    Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    
    MsgBox "first"
    
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    
    strSql = "insert into izmiran(N_MES) values(?)"
    
    
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    
    
    
    con.Open
    
  MsgBox "tata"
    
    Set oCmd = CreateObject("ADODB.Command")

    MsgBox "tata2"
    oCmd.ActiveConnection = con
    
 
    
    oCmd.CommandText = sql
    
    MsgBox "qwerty2"
    
    oCmd.CommandType = adCmdStoredProc

    oCmd.NamedParameters = False
    
    MsgBox "qwerty3"
    
    oCmd.Parameters.Refresh
    'oCmd.Parameters.Append oCmd.CreateParameter("N_MES", adInteger, adParamInput, , 897)
    
    oCmd.Parameters.Item(1).Value = 897
    
    oCmd.Prepared = True
    'oCmd. = 15
    
    MsgBox "qwerty4"
    
    oCmd.Execute
    
    MsgBox "qwerty5"
    
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
    
    
End Sub
ivan.tiran вне форума Ответить с цитированием
Старый 20.08.2019, 16:46   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

а чего adCmdStoredProc? И что в sql?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.08.2019, 16:53   #6
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
а чего adCmdStoredProc? И что в sql?
С sql ошибка вышла. Там должен стоять strSql. Интерпретатор к сожалению не ругается в Outlooke. А что вместо adCmdStoredProc ичпользовать? Завтра исправлю, отпишусь, уже не на работе.
ivan.tiran вне форума Ответить с цитированием
Старый 20.08.2019, 16:58   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

если insert в strSql то 1 или adCmdText
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.08.2019, 17:05   #8
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
"@N_MES" - не ? и если добавлять параметры, то refresh по-моему не нужен
или
oCmd.Parameters.Item(1).Value = 897 а так refresh перед присвоением значений нужен
А refresh перед каждым присвоением использовать или достаточно один раз?
ivan.tiran вне форума Ответить с цитированием
Старый 20.08.2019, 17:50   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

1 раз перед присвоениями
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.08.2019, 20:19   #10
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от ivan.tiran Посмотреть сообщение
Интерпретатор к сожалению не ругается в Outlooke.
Option Explicit в начало модуля вставили?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметризированный запрос - C# SAgeev Помощь студентам 1 15.01.2016 22:33
Параметризированный класс стека С++ AlexQQ Помощь студентам 0 06.06.2013 14:57
параметризированный запрос access 2007 TaTT DoGG C# (си шарп) 9 01.11.2012 12:40