Lotus и MS SQL (ODBC)

  • Автор темы IsAvailable
  • Дата начала
I

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]Может, кто подскажет, что я не так делаю? И как сделать правильно?
 
O

oshmianski

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

IsAvailable

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

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

Gor

Пыхчу, пытаясь законектиться к 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...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
 
O

osmor

А я пыхчу, пытаюсь законектиться с помощью ODBC.
На серваке соединение ODBC установил. С правами на базу и на таблицу всё нормально.
из Лотус с ODBC не работал. ODBC устаревшая технология, ей на смену пришло ADODB

Data error during conversion
Судя по сообщению у вас ошибка при конвертировании типов данных, какие типы полей в таблице на MSSQL ?
 
G

Gor

Проблему решил, всё получилось. Немного поконкретнее разобрал 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">
Код:
	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()
В таком виде работает для моих типов данных в таблице.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Собственно вопрос к тем кто делал импорты через MSSQL - ODBC - Lotus
у себя проверяю всё пашет у заказчика ODBC вместо кирилицы возвращает "?" знако вопроса, цифры возвращает правильно
Куда копать и что настраивать?
 
Y

Yakov

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
вот и я спрашиваю - напуркуа ОДБЦ... ну глючное оно и зависит от WS...
 
K

K-Fire

SET NAMES=CP1251;

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

Kizarek86

Green Team
20.07.2007
875
8
BIT
119
Недавно сталкивался, мы решили изменением настроек сервера:
Локейшен на русский, и "Язык программ не поддерживающих юникод" тоже на русский.
 
N

nvyush

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

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Вопрос: как расширить буфер в ODBC MSSQL?

Имеем код:
Код:
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 за который никак ни перехагнуть, никто не вкурсе как перешагнуть кроме как уменьшение селекта?
 
T

TIA

Попробуй
ResultSet.CacheLimit=DB_NONE

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
TIA
спасибо, помогло ResultSet.CacheLimit=DB_NONE
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!