Lotus и MS SQL (ODBC)

Тема в разделе "Lotus - Программирование", создана пользователем IsAvailable, 31 янв 2007.

  1. IsAvailable

    IsAvailable Гость

    Есть источник данных lotusdb
    СУБД - MS SQL
    В этом источнике есть база lotusdb
    В этой базе - таблица t2 с полями a1(int) a2(varchar)
    Прочитать данные из таблицы получается без проблем, а вот внести изменения - нет (
    Вроде бы и автокиммит включаю... И "насильно" коммит вызываю.
    Но данные остаются прежними.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='vb'>Sub Click(Source As Button)
    Dim retcode As Integer
    Dim datasource As String
    Dim username As String
    Dim userpass As String
    Dim odbccon As ODBCConnection
    Dim i As Integer
    Dim j As Integer

    datasource = "lotusdb"
    username = "tester"
    userpass = "12345"
    Set odbccon = New odbcconnection
    Print "LS:DO LSX Version: " & odbccon.getLSDOMasterRevision
    '================= подключаемся к базе
    retcode = odbccon.ConnectTo(datasource,username,userpass)
    If retcode Then
    Print "ODBC connection to " & datasource & " opened."
    Else
    Messagebox "the ODBC connection could not be established. Exiting."
    Messagebox "error number " & odbccon.GetError & Chr(13) & "error message: " & odbccon.GetExtendedErrorMessage
    Exit Sub
    End If
    '======
    Dim sqlquery As New ODBCQuery
    Dim thesql As String
    thesql = "select a1, a2 from t2"
    Set sqlquery.Connection = odbccon
    sqlquery.SQL = thesql

    '================= выполняем запрос
    Dim resultset As New ODBCResultSet
    Set resultset .Query = sqlquery
    Call resultset.Execute
    '======
    If resultset.GetError <> DBstsSUCCESS Then
    Messagebox "Ошибка при выполнении запроса!!!"
    Exit Sub
    Else
    '================= обрабатываем итоги запроса
    odbccon.AutoCommit = True

    Call resultset.LastRow
    Messagebox Cstr(resultset.NumRows)
    Call resultset.FirstRow
    For i=1 To resultset.NumRows
    msg$ = ""
    For j=1 To resultset.NumColumns
    msg$ = msg$ & resultset.GetValue(j) & " "
    Next
    Call resultset.NextRow
    Messagebox msg$
    Next

    Call resultset.FirstRow
    Call resultset.SetValue(2,"trrrr")
    Call odbccon.CommitTransactions


    For i=1 To resultset.NumRows
    msg$ = ""
    For j=1 To resultset.NumColumns
    msg$ = msg$ & resultset.GetValue(j) & " "
    Next
    Call resultset.NextRow
    Messagebox msg$
    Next

    Call odbccon.CommitTransactions
    Call odbccon.Disconnect

    '======
    End If
    End Sub[/CODE]Может, кто подскажет, что я не так делаю? И как сделать правильно?
     
  2. oshmianski

    oshmianski Гость

    Для: IsAvailable
    я считаю, что правильнее будет перенести процесс обработки данных на сторону MS SQL сервера. Т.е. на нем пишется хранимая процедура, а из лотуса дергается именно она. хранимой процедуре можно передавать в качестве аргументов нужные данные.
     
  3. IsAvailable

    IsAvailable Гость

    Для: oshmianski
    Идея хорошая. Надо будет продумать и такой вариант. Просто не хочется взваливать на себя еще и MS SQL - хочется ограничится только Лотусом :)

    P.S.
    Разобрался, почему не работало. Как всегда всё оказалось до банальности просто.
    После обновления данных забыл строчку:
    Call resultset.UpdateRow
    В общем, извиняюсь за вопрос свой :p
     
  4. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Пыхчу, пытаясь законектиться к MS SQL с помощью ODBC.
    На серваке соединение ODBC установил. С правами на базу и на таблицу всё нормально.

    создал вот такого агента
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='vb'>Option Explicit
    Uselsx "*LSXODBC"

    Sub Initialize
    Dim con As New ODBCConnection
    Dim qry As New ODBCQuery
    Dim result As New ODBCResultSet

    Dim msg As String

    On Error Goto errorHandler

    con.ConnectTo("Project")
    Dim s2,s1,s,status,namee,namee1,fields As Variant

    status = con.IsConnected
    namee = con.DataSourceName
    namee1 = con.ListTables("Project")

    fields = con.ListFields("Lotus_Notes_Requests")

    Set qry.Connection = con
    qry.SQL = "SELECT * FROM Lotus_Notes_Requests"

    Set result.Query = qry
    Call result.Execute

    s = result.ReadOnly
    s1 = result.IsResultSetAvailable
    s2 = result.NumColumns
    ' if False then is Available for read and write else True

    Call result.AddRow

    Call result.SetValue(1,Cint("10"))
    Call result.SetValue(2, "test")
    Call result.SetValue(3, "test")
    Call result.SetValue(4, "test")
    Call result.SetValue(5, "test")
    Call result.SetValue(6, "test")

    Call result.UpdateRow

    result.Close(DB_CLOSE)
    con.Disconnect
    Exit Sub

    errorHandler:
    Messagebox result.GetExtendedErrorMessage,, _
    result.GetErrorMessage
    Exit Sub
    End Sub[/CODE]
    Получить значения из нужной мне таблицы я могу, а записать нет.
    В коде коннекшн проходит нормально. Могу получить имена всех таблиц.

    Также s = result.ReadOnly = False
    Вроде бы должен писать. НО Вылетает вот на этой строчке - Call result.UpdateRow - в errorHandler

    ОШИБКА - 622 LS:DO - Data error during conversion

    Никто с таким не сталкивался??

    Если сейчас не получится этим способом придётся пробовать через ADO...
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  6. osmor

    osmor Гость

    из Лотус с ODBC не работал. ODBC устаревшая технология, ей на смену пришло ADODB

    Судя по сообщению у вас ошибка при конвертировании типов данных, какие типы полей в таблице на MSSQL ?
     
  7. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Проблему решил, всё получилось. Немного поконкретнее разобрал SQL ную таблицу по типам данных. Действительно проблема была в них.
    Хотя SetValue у меня так и не заработал. Пришлось делать с помощью SQL запроса и параметров.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
        qry.SQL = "INSERT INTO Lotus_Notes_Requests (request_id,request_subj,request_val_chain,request_status,request_responsible
    ,request_start_date)"
    qry.SQL = qry.SQL & " VALUES ( ?param7?, ?param2?, ?param3?, ?param5?,?param4?,?param6?)"

    Set result.Query = qry

    asa = {'}+a(0)+{'} 'request_subj                                       
    asa1 = {'}+a1(0)+{'} 'request_val_chain
    asa2 = {'}+a2(0)+{'} 'request_responsible                        
    asa3 = {'}+a3(0)+{'} 'request_status                                     
    asa5 = {'}+"1/1/2001"+{'} 'request_start_date              
    asa6 = {'}+"77777"+{'} 'request_id                                       

    Call result.SetParameter(1, asa6)
    Call result.SetParameter(2, asa)
    Call result.SetParameter(3, asa1)
    Call result.SetParameter(4, asa3)
    Call result.SetParameter(5, asa2)
    Call result.SetParameter(6, asa5)

    Call result.Execute()
    В таком виде работает для моих типов данных в таблице.
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Собственно вопрос к тем кто делал импорты через MSSQL - ODBC - Lotus
    у себя проверяю всё пашет у заказчика ODBC вместо кирилицы возвращает "?" знако вопроса, цифры возвращает правильно
    Куда копать и что настраивать?
     
  9. Yakov

    Yakov Гость

    Попробуйте поиграть параметром AutoTranslate строки подключения (connection string). То же самое на 4-ом экране мастера настройки источника данных ODBC.
    Или используйте Java + JDBC. :)
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    вот и я спрашиваю - напуркуа ОДБЦ... ну глючное оно и зависит от WS...
     
  11. K-Fire

    K-Fire Гость

    SET NAMES=CP1251;

    Что-то в этом духе надо прописать. Я тут писал уже когда то на форуме, поищите.
     
  12. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Недавно сталкивался, мы решили изменением настроек сервера:
    Локейшен на русский, и "Язык программ не поддерживающих юникод" тоже на русский.
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Недавно делал выгрузку в MSSQL и тоже столкнулся с проблемой - никак не хотело экспортироваться числовое поле. Ошибка вылетала совсем не вразумительная, но как я понял, дело было в десятичном разделителе. Игрался с настройками и DSN и сервера - победить не смог, тупо поставил у хранимой процедуры тип параметра int, благо задача это позволяла. Может кто знает, как с этим бороться (на будущее)

    P.S. Клинило на строчке:
    ODBCRes.ExecProcedure("p_StoredProcedure", doc.UniversalID, doc.ParentDocumentUNID, doc.GetItemValue("Title")(0), doc.GetItemValue("Volume")(0))
    где ODBCRes - ODBCResultSet
     
  14. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Вопрос: как расширить буфер в ODBC MSSQL?

    Имеем код:
    Код (Text):
    SQLCommand = {SELECT [number], cast([name] as char(20)), [citytype], [parent_id] FROM } & IndexTable & {[vw_br_city]}
    Set SQLQuery = New ODBCQuery
    Set SQLQuery.Connection = ODCConn
    SQLQuery.SQL = SQLCommand
    Set ResultSet = New ODBCResultSet
    Set ResultSet.Query = SQLQuery
    Call ResultSet.Execute
    'Проход по всем записям
    Do
    ......
    'Следующая запись
    ResultSet.NextRow
    Loop While Not ResultSet.IsEndOfData
    и всё бы хорошо, но когда записек много за 20К то на последней строке Loop While Not ResultSet.IsEndOfData мы получаем ошибку
    LS:DO-Out of memory, получается буфер порядка 950Kb за который никак ни перехагнуть, никто не вкурсе как перешагнуть кроме как уменьшение селекта?
     
  15. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Попробуй
    ResultSet.CacheLimit=DB_NONE

    А лучше на Lotus Connector переходи
     
  16. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    а не DB_ALL?
    и куда вставлять эу строку, до
    Call ResultSet.Execute
    или уже после(тогда как оно работает)
     
  17. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    До.

    И ещё проверку IsEndOfData приходилось дублировать.
    If Rs.IsEndOfData Then If Rs.IsEndOfData Then Exit Do

    Это шаманские бубны и смысла тут искать бессмысленно.
     
  18. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    TIA
    спасибо, помогло ResultSet.CacheLimit=DB_NONE
     
Загрузка...
Похожие Темы - Lotus SQL (ODBC)
  1. yerke
    Ответов:
    48
    Просмотров:
    14.333
  2. swyatogor
    Ответов:
    30
    Просмотров:
    1.207
  3. anna
    Ответов:
    15
    Просмотров:
    1.129
  4. nayke
    Ответов:
    11
    Просмотров:
    3.692
  5. NickProstoNick
    Ответов:
    17
    Просмотров:
    5.321

Поделиться этой страницей