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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2019, 14:51   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию insert вместе с returning в vba

Добрый день. Нужно вернуть id по результатам insert. Так не работает.

Код:
Private Sub WriteMessageIn(Item As Outlook.MailItem, hType As HeaderType, databaseName As String, databaseUser As String, databaseUserPassword As String)
    Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    Dim rs As ADODB.Recordset
        
        
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    strSql = "INSERT INTO MESSAGE_IN(NAME_S) VALUES(?) RETURNING MESSAGE_IN.ID_MES INTO ?"
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    con.Open
    Set oCmd = CreateObject("ADODB.Command")
    oCmd.ActiveConnection = con
    oCmd.CommandText = strSql
    oCmd.CommandType = adCmdTable

    oCmd.NamedParameters = False
    
    oCmd.Prepared = True
    
    MsgBox "qwerty0"
    
    oCmd.Parameters.Append oCmd.CreateParameter(NAME_S, adVarChar, adParamInput, Len("test"), "test")
    
    MsgBox "qwerty1"
    Set rs = oCmd.Execute
    MsgBox "qwerty2"
    
    rs.Close
    Set rs = Nothing
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
    
    MsgBox "end"
    
End Sub
execute не проходит. Что я делаю не так?

oCmd.CommandType пробовал разный ставить

Последний раз редактировалось ivan.tiran; 21.08.2019 в 14:53. Причина: Нужно дополнить вопрос
ivan.tiran вне форума Ответить с цитированием
Старый 21.08.2019, 15:06   #2
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Код:
Private Sub WriteMessageIn(Item As Outlook.MailItem, hType As HeaderType, databaseName As String, databaseUser As String, databaseUserPassword As String)
    Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    Dim rs As ADODB.Recordset
        
        
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    strSql = "begin insert into message_in(NAME_S) VALUES('ÈÇÌÈÐÀÍ') returning message_in.id_mes into :id; end;"
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    con.Open
    Set oCmd = CreateObject("ADODB.Command")
    oCmd.ActiveConnection = con
    oCmd.CommandText = strSql
    oCmd.CommandType = adCmdText

    oCmd.NamedParameters = True
    
    oCmd.Prepared = True
    
    MsgBox "qwerty0"
    
    oCmd.Parameters.Append oCmd.CreateParameter(NAME_S, adVarChar, adParamInput, Len("test"), "test")
    
    MsgBox "qwerty1"
    Set rs = oCmd.Execute
    MsgBox "qwerty2"
    
    rs.MoveFirst
    
    MsgBox "qwerty3"
    
    MsgBox rs(":id")
    
    'rs.Close
    'Set rs = Nothing
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
    
    MsgBox "end"
    
End Sub
Так прошёл execute, но не работает rs.MoveFirst
ivan.tiran вне форума Ответить с цитированием
Старый 22.08.2019, 08:34   #3
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Кому интересно, как я вернул id из insert, вот мой код

Код:
Private Function WriteMessageIn(Item As Outlook.MailItem, hType As HeaderType, databaseName As String, databaseUser As String, databaseUserPassword As String) As Long
    Dim strSql As String
    Dim driverParameters As String
    Dim con As Object
    Dim oCmd As Object
    Dim commString As String
        
    driverParameters = "Provider=OraOLEDB.oracle;USER ID=" & databaseUser & ";Password=" & databaseUserPassword & ";Data Source=" & databaseName
    strSql = "begin insert into message_in(NAME_S,WAY,NAME_F,DATE_ENT,DATE_REC,DATE_DB,COMM,DEL_REC,KOD_REC) VALUES(?,?,?,?,?,?,?,?,?) returning message_in.id_mes into :id; end;"
    
    Set con = CreateObject("ADODB.connection")
    con.ConnectionString = driverParameters
    con.Open
    Set oCmd = CreateObject("ADODB.Command")
    oCmd.ActiveConnection = con
    oCmd.CommandText = strSql
    oCmd.CommandType = adCmdText
    oCmd.NamedParameters = True
    oCmd.Prepared = True
    
    If (hType = PROGNOZ) Then
        commString = "ôîðìàëèçîâàííûé òåêñò ïèñüìà"
    Else
        commString = getCommStringForMessageIn(Item, ",")
    End If
    
    oCmd.Parameters.Append oCmd.CreateParameter(NAME_S, adVarChar, adParamInput, Len("ÈÇÌÈÐÀÍ"), "ÈÇÌÈÐÀÍ")
    oCmd.Parameters.Append oCmd.CreateParameter(WAY, adVarChar, adParamInput, Len("e-mail"), "e-mail")
    oCmd.Parameters.Append oCmd.CreateParameter(NAME_F, adVarChar, adParamInput, Len(Item.Subject), Item.Subject)
    oCmd.Parameters.Append oCmd.CreateParameter(DATE_ENT, adDate, adParamInput, , Item.ReceivedTime)
    oCmd.Parameters.Append oCmd.CreateParameter(DATE_REC, adDate, adParamInput, , Now())
    oCmd.Parameters.Append oCmd.CreateParameter(DATE_DB, adDate, adParamInput, , Now())
    oCmd.Parameters.Append oCmd.CreateParameter(COMM, adVarChar, adParamInput, Len(commString), commString)
    oCmd.Parameters.Append oCmd.CreateParameter(DEL_REC, adBigInt, adParamInput, , 0)
    oCmd.Parameters.Append oCmd.CreateParameter(KOD_REC, adBigInt, adParamInput, , 0)
    
    oCmd.Parameters.Append oCmd.CreateParameter("id", adBigInt, adParamOutput)
    
    oCmd.Execute
    
    WriteMessageIn = oCmd.Parameters("id").Value
    Set oCmd = Nothing
    con.Close
    Set con = Nothing
End Function
ivan.tiran вне форума Ответить с цитированием
Старый 22.08.2019, 09:05   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Но, у меня новая проблема.
Когда я записываю дату таким образом в БД, всё проходит нормально.

Код:
oCmd.Parameters.Append oCmd.CreateParameter(DATE_DB, adDate, adParamInput, , Now())
Но, стоит мне в начале написать.

Код:
Dim beginDate As Date
beginDate = Now()
И попробовать вот так записать

Код:
oCmd.Parameters.Append oCmd.CreateParameter(DATE_DB, adDate, adParamInput, , beginDate)
то запись не проходит.

Как в итоге в параметры передать дату, которую я объявил раньше?
ivan.tiran вне форума Ответить с цитированием
Старый 22.08.2019, 10:58   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Пишут, что тип результата now() - Variant(Date). Я в vba постольку поскольку, думаю что тип Date и Variant(Date) далеко не одно и то же. Отсюда бы и плясал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.08.2019, 11:02   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Я в vba постольку поскольку, думаю что тип Date и Variant(Date) далеко не одно и то же. Отсюда бы и плясал
т.е. надо попробывать:

Код:
Dim beginDate As Variant
beginDate = Now()
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.08.2019, 11:18   #7
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
т.е. надо попробывать:

Код:
Dim beginDate As Variant
beginDate = Now()
Спасибо. Работает!!!
ivan.tiran вне форума Ответить с цитированием
Старый 22.08.2019, 11:28   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от ivan.tiran Посмотреть сообщение
Спасибо. Работает!!!
Это не мне "спасибо", это Аватару спасибо!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.08.2019, 15:08   #9
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это не мне "спасибо", это Аватару спасибо!
И Аватару спасибо!
ivan.tiran вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi - IBX 19_19 вопрос с поддержкой оператора RETURNING KBO Помощь студентам 0 02.10.2018 13:48
insert into сразу в несколько таблиц (вложенный insert) dualtrey Помощь студентам 10 23.01.2017 18:00
Предложение Returning NatNiM БД в Delphi 0 04.08.2010 17:13
Загрузить библиотеку вместе сразу вместе с программой Anekdot Общие вопросы Delphi 4 26.01.2010 23:14
Год вместе... NITRO2025 Свободное общение 14 23.01.2010 15:24