ODBCConnection

  • Автор темы olegber
  • Дата начала
O

olegber

#1
Здравствуйте.
Проблема с LocateRow при использовании ODBCConnection.
<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">
Код:
Dim con As ODBCConnection
Dim qry As New ODBCQuery
Dim Result As New ODBCResultSet
Set con = New ODBCConnection
con.SilentMode = True		
status = con.ConnectTo( "oracle 10g ","test","test" )	
If Not status Then
Print "Error:Conection Failed "&con.GetExtendedErrorMessage(con.GetError)
Exit Sub
Else 
Print "Conection OK"
End If
Set qry.Connection = con
Query="Select id from tablica where id <>0 ''''-----(возращает около 70000 строк)
result.CacheLimit=DB_ALL	
qry.SQL=Query
Set result.Query = qry
If result.Execute Then
If result.IsResultSetAvailable Then
result.FirstRow 
If result.LocateRow(1,999) Then
Print "Ok"	
Else
Print "Bad"	''''''''---не находит значение(всё время переходит на эту строку)
Print result.GetExtendedErrorMessage( result.GetError) '''''''------ NOERROR		
End If
end if
end if
Если поменять запрос: Query="Select id from tablica where id = 999 , тогда работает корректно (Print "OK").
Не могу разобраться почему так.(может быть дело в большом количество строк в SQl запросе, или упустил какую-нибудь настройку ODBC?)
Спасибо за помощь.
 
S

Sandr

#2
вообще то в result.LocateRow(1,999) второй параметр должен быть строкой... Может в этом дело?


Для того, что бы понять о каком-то лимите строк посмотрите на результат Result.NumRows
 
O

olegber

#3
<!--QuoteBegin-Sandr+12:12:2007, 13:45 -->
<span class="vbquote">(Sandr @ 12:12:2007, 13:45 )</span><!--QuoteEBegin-->вообще то в result.LocateRow(1,999) второй параметр должен быть строкой... Может в этом дело?
[snapback]89566" rel="nofollow" target="_blank[/snapback]​
[/quote]
-дело точно не в этом,ведь при смене SQL запроса-всё выполняется корректно
(хотя в хэлпе сказано должна быть строка).
<!--QuoteBegin-Sandr+12:12:2007, 13:45 -->
<span class="vbquote">(Sandr @ 12:12:2007, 13:45 )</span><!--QuoteEBegin-->Для того, что бы понять о каком-то лимите строк посмотрите на результат Result.NumRows
[snapback]89566" rel="nofollow" target="_blank[/snapback]​
[/quote]
-Что мне это даст?

lotus 5.0
 
O
#4
Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim result As New ODBCResultSet
Set qry.Connection = con
Set result.Query = qry
con.ConnectTo("lotus")

надо вытащить данные из оракла в лотус,
мне подключили драйвер Oracle inOraCLient10g_home1

вопрос: для работы кода выше, нужен принципиально Microsoft ODBC for Oracle или должно работать и с тем, кот. подключили???
 
O

oxystile

#5
<_< получилось!

вот еще такой вопрос
variable1 = result.GetValue( "BPARTNERID",variable1) - это значение получаю
variable2=result.GetValue( "PARENTBPARTNERNAME",variable2) а здесь ошибка 621
разработчики говорят, что колонки по структуре одинаковы

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

Вложения

  • 505.7 КБ Просмотры: 16
S

Sandr

#6
oxystile

Ошибка 621 - значит, что не сожет сконвертировать данные.
Попробуйте variable2 вариантом сделать...
 
O

oxystile

#9
да, в принципе все равно, что юзать, главное данные вытащить
а с LSX ранее не сталкивалась
как тогда с LSX выполнить strSQL = "select * from bpartners_vw t" и получить поле?
дайте,плиз, наводку

Ответ с кодом под LSX уехал в сюда.
 
A

allex

#10
На SuSE стоит Domino 7.0.2, установлен unixODBC, настроен конект через ODBC на MYSQL 5.0.67.
Тесты на конект с использованием утилиты сервера Domino dctest, проходит успешно.

А вот скриптом агента не проходит

<!--shcode--><pre><code class='ls'>Uselsx "*LSXODBC"

Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = session.CurrentDatabase

Set con = New ODBCConnection
Set qry = New ODBCQuery
Set result = New ODBCResultSet
Set qry.Connection = con
Set result.Query = qry

DataSource$ = "name ODBC conect"
UserName$ = "uname"
Password$ = "upass"

status=con.ConnectTo(DataSource$, UserName$, Password$)
Print "Status: "& Cstr(status)[/CODE]
ошибка подключения к БД
status = false

Подскажите что не так?
 
30.05.2006
1 345
11
#12
Лень копаться. С MS-ODBC какие-то глюки имел. И разработчики видимо тоже, т.к. на этот набор классов похоже махнули рукой.
Рекомендую юзать LSX. Там нативные коннекторы унифицированы, в т.ч. и ODBC.
 
A

allex

#13
А что пишет con.GetError и con.GetExtendedErrorMessage ?
С ODBC я подозреваю что он ищет локальный документ подключения, а мне нужен тот что настроен на сервере.

Рекомендую юзать LSX. Там нативные коннекторы унифицированы, в т.ч. и ODBC.
Если я правильно понимаю, но нужно ставить DECS и в ней прописывать документ подключения, например (oracle).
И его уже прописывать в качестве имени соединения.
Код для пояснения мыслей
Код:
[Options]
Option Public
Option Explicit
Uselsx "*lsxlc"

[Initialize]
Sub Initialize
Dim sess As New LCSession
Dim conn As New LCConnection ("oracle")

'set the connection parameters...
conn.Server = "servername"
conn.UserId = "userid"
conn.Password = "password"
 

Вложения

30.05.2006
1 345
11
#14
Если я правильно понимаю, но нужно ставить DECS и в ней прописывать документ подключения, например (oracle).
Неправильно. Для использования LSX ничего, кроме клиента соотв. СУБД, ставить не нужно.
Для ODBC-шных классов надо И клиента, И odbc (его ещё и настроить нетривиально)
 
I

IsAvailable

#15
Что-то столкнулся с непонятной мне проблемой - может сможет кто подсказать...
Или хотя бы в какую сторону покопать...

Есть файл dbf (dBase III) - test.dbf
Есть источник данных в системном DSN - "test" (Microsoft dBase Driver)
Пишу скрипт, который цепляет эту базу через XLS
База цепляется, читается, но записать туда не могу ничего =\
Уж и UpdateRow пишу, уж и commit'ы где только не ставил...
<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'>Dim con As ODBCConnection
Dim qry As ODBCQuery
Dim result As ODBCResultSet

datasource$ = "test"

Set con = New ODBCConnection
retcode = con.ConnectTo(datasource$)
If retcode Then
Print "ODBC connection to " & datasource$ & " opened."
Else
Exit Sub
End If

Set qry = New ODBCQuery
Set qry.Connection = con
qry.SQL = "SELECT * FROM test"

Set result = New ODBCResultSet
Set result.Query = qry
Call result.Execute

If result.GetError <> DBstsSUCCESS Then
Print "Ошибка при выполнении запроса"
Exit Sub
Else
con.AutoCommit = True
Call result.LastRow
Call result.FirstRow
Call result.SetValue(4, "Name")
Call result.UpdateRow
Call con.CommitTransactions
End If
con.Disconnect[/CODE]
 

Gor

Well-known member
07.06.2005
517
1
#16
Были похожие проблемы - не всега срабатывали методы result.SetValue
Поэтому практически всегда пользовался выполнением нужного мне SQL запроса
Вот рабочий код, 6 параметров - добавляет строку в таблицу с ними, чистить не стал может быть много "воды", надеюсь поможет:
<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">
Код:
Option Public
Uselsx "*LSXODBC"

Sub Initialize
'******************************************'select document which need to insert in MS SQL DB
Dim doc As NotesDocument
Dim coll As NotesDocumentCollection
Dim session As New NotesSession
Dim db As NotesDatabase

Dim peopledb As NotesDatabase
Dim persondoc As NotesDocument
Dim bynameView As NotesView

Set db = session.CurrentDatabase
Set peopledb = session.GetDatabase ( db.Server, "people.nsf" )
Set bynameView = peopledb.GetView( "(ByName)" )

Set session = New NotesSession
Set db = session.CurrentDatabase


Set doc = session.DocumentContext


If doc.Type(0) = "Incident" Then
Exit Sub
End If

'****************************************END SELECTED

'****************************************ODBC Classes Initialize
Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim result As New ODBCResultSet
Dim msg As String

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

Set qry.Connection = con

Set persondoc = bynameView.GetDocumentByKey (doc.AssignedTo(0))

'get all fields from IT request
a = doc.Subject(0)
a1 = doc.VC(0)

a2 = persondoc.CEDSid(0)
aa3 = doc.CreatedWhen(0)	
a3 = Left(aa3,10)
a3 = Replace( a3 ,".","/") 
aa = Right(a3,5)	 '/2008
aaa = Strleft(a3,aa) '26/12

a3 = Right(aaa,2) + "/" +Left(aaa,2) + aa

a4 = doc.Number(0)


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+{'} 'request_subj										 'doc.Subject	
asa1 = {'}+a1+{'} 'request_val_chain							'new field in IT request
asa2 = {'}+"europe\"+a2+{'} 'request_responsible	 'cedsid - doc.AssignedTo	
asa3 = {'}+"0"+{'} 'request_status										'1- Draft, Archived or 0 - Others
asa5 = {'}+a3+{'} 'request_start_date								 'doc.CreatedWhen
asa6 = {'}+a4+{'} 'request_id										  'doc.Number

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()

result.Close(DB_CLOSE)
con.Disconnect

Exit Sub

errorHandler:
Print "Error at line" & Erl() & Str(Err) & ": " & Error$	

Exit Sub 

End Sub
 
I

IsAvailable

#17
Gor
В самом деле! Ну надо же... Спасибо! :)
Сделал через UPDATE и закомитил - обновления сохранились!
 

susinmn

Well-known member
16.10.2007
529
3
#19
Не работает
Call con.ConnectTo ("Provider=MSDASQL;DSN=front-4;SRVR=Сервер;DB=База;UID=Пользователь; PWD=Пароль")
Если установить клиент front у себя, то все работает

знакомый аналогичное подключение делает с помощью php , *подключая библиотеку* и у него работает без клиента.

1. Как можно драйвера клиента front запихать в лотусовую бд, что бы не ставить клиент front?
1. Можно ли php библиотеку теоретически под Lotus переделать?