• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

Lotus и Oracle (ODBC)

  • Автор темы Sandro
  • Дата начала
S

Sandro

#1
Привет всем!
Не могу подключиться к Odbc C вводом пароля...
Подключаюсь к Оракловой базе при помощи родного(Ораклового) ODBC драйвера:
Код:
Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim res As New ODBCResultSet
con.ConnectTo(datasource)
Всё нормально появляется окошко, вводим логин и пароль, всё работает
теперь надо подключиться с известным логином и паролем автоматически, в примерах делают так con.ConnectTo(datasource,login,password), не получается, я так понимаю, надо ввести определённый ConnectionString (с ODBC никогда раньше не работал, а тут особо вариантов нет,приходится использовать),делаю по мануалу, ничего не получается ((((
У кого нить есть пример подключения к Ораклу с вводом логина и пароля ???
 
S

Sandro

#3
:KillMe: Блин, в мануалах всё просто, делаю "DSN=название odbc источника;DBQ =имя в tnsnames;UID=пользователь;PWD=пароль" и ничего (((( Ну может кто нибудь реально к Ораклу цеплялся ????
 
Z

ZhAN

#4
Если еще актуально !
создайте днс подключение на том компе от куда работать все это должно,
вот кусок кода конекчусь к SQL также и к дб2 думаю оракл ламаться не будет :

Код:
Option Public
Option Explicit
Uselsx "*LSXODBC"
 
Const ODBC_SOURCE = "ДНС-НАЗВАНИЕ"
Const ODBC_LOGIN = "ПОЛЬЗОВАТЕЛЬ"
Const ODBC_PASSWORD = "ПАРОЛЬ"
 
Dim SQLconnection As New ODBCConnection
Dim SQLquery As New ODBCQuery
Dim SQLresult As New ODBCResultSet
Dim query As String
Set SQLquery.Connection = SQLconnection
Set SQLresult.Query = SQLquery
Call SQLconnection.ConnectTo(ODBC_SOURCE, ODBC_LOGIN, ODBC_PASSWORD)
query = {ЗАПРОС}
SQLquery.SQL = query
If SQLresult.Execute Then
'...
End If
 
K

Karlosss

#6
Привет всем! в LN 6.5, 7. Скрипт запускаю локально.
Цепляюсь через odbc, 10 драйвер к ораклу. Далее выполняется sql запрос. Потом обрабатываю.
Стандартный код:

Код:
Call con.ConnectTo("","","") 'подключение к ODBC
status = con.ConnectTo ("")
If Status = False Then
Messagebox "Не могу подключиться к источнику данных ODBC: " + odb, 16, "Внимание !!!"
Exit Sub
End If

Set qry = New ODBCQuery
Set result = New ODBCResultSet
Set qry.Connection = con
Set result.Query = qry
qry.SQL= {SELECT	 * }

If Not result.Execute Then
Messagebox result.GetExtendedErrorMessage,,result.GetErrorMessage
Call result.Close(DB_CLOSE)	
Call con.Disconnect
Exit Sub
End If

result.cacheLimit =DB_ALL

Do
result.NextRow

doc.field=result.GetValue("value")
..........................		

Loop Until result.IsEndOfData
Call result.Close(DB_CLOSE)	
Call con.Disconnect
Как здесь скрипт считает строки. Когда входит в цикл на строчке result.NextRow все в порядке берется 1 строка.Далее проходим 1 круг и в конце круга на Loop Until result.IsEndOfData счетчик переходит на следующую строку и далее на строке result.NextRow снова прибавляется еще одна строка. В итоге данные записываются в Lotus через строку. Не понимаю почему в конце круга на строке Loop Until result.IsEndOfData переходится на след. строку. Подскажите плз как с этим бороться!!
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#7
почему цикл не такой
Do While Not result.IsEndOfData
doc.field=result.GetValue("value")
result.NexRow
Loop
 
K

Karlosss

#8
так тоже не работает, на строках
result.NextRow
Loop
прибавляет оба раза по одному
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#9
тогда я не понял - чего прибавляет?
надо с примером что должно быть, что получается
 
D

Darker

#10
Так ты постоянно затираешь значение doc.field при обходе каждой строки
Если хочешь, чтобы все в одно поле собралось, то используй
Do
result.NextRow
doc.field=arrayappend(doc.field,result.GetValue("value"))
Loop Until result.IsEndOfData
 
K

Karlosss

#11
Do
result.NextRow - счетчик строк оракла 2+1=3 - цикл второй круг

Выгружаем строку в excel счетчик строк оракла =1 - начало, вхождение в цикл

строка в excel=строка в оракловой базе - 1 круг цикла в 1 строку в excel записывает 1 строку оракла
строка в excel=строка в оракловой базе - 2 круг цикла в 2 строку в excel записывает 3 строку оракла

..........................

Loop Until result.IsEndOfData счетчик строк оракла 1+1=2
Call result.Close(DB_CLOSE)
Call con.Disconnect

так происходит потому что на строчке кода Loop Until result.IsEndOfData
происходит переход на след. строку и дальше на строке кода result.NextRow снова переход на след. строку хотя
этого не должно быть.

Добавлено:
Так ты постоянно затираешь значение doc.field при обходе каждой строки
Если хочешь, чтобы все в одно поле собралось, то используй
Do
result.NextRow
doc.field=arrayappend(doc.field,result.GetValue("value"))
Loop Until result.IsEndOfData
Да нет , док я использовал просто для примера, какая разница куда записывать в док или в ексель, в данном случае я гружу в ексель
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#12
может "переход" на операции чтения, а не проверки?
тогда убрать NextRow
 

TIA

:-)
Lotus team
15.05.2009
790
3
#13
Karlosss, попробуй так

Код:
Rs.CacheLimit=DB_NONE
Rs.Execute
If Not Rs.IsResultSetAvailable Then Error ...
If Rs.FirstRow Then		 
Do 
...
If Rs.IsEndOfData Then If Rs.IsEndOfData Then Exit Do 'so need
Rs.NextRow
Loop
End If
 
K

Karlosss

#14
Karlosss, попробуй так

Код:
Rs.CacheLimit=DB_NONE
Rs.Execute
If Not Rs.IsResultSetAvailable Then Error ...
If Rs.FirstRow Then		 
Do 
...
If Rs.IsEndOfData Then If Rs.IsEndOfData Then Exit Do 'so need
Rs.NextRow
Loop
End If
Спасибо! Так получилось. Я правда нашел обходной путь , но довольно коряво , а таким образом все красиво отрабатывает.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#15
Вот и славно. На сколько я помню, твоя проблема лечится Rs.CacheLimit=DB_NONE, а остальные извраты для других проблем.
 

Xalet

Well-known member
08.08.2008
410
0
#17
У меня выглядит примерно так и всё работает:
Код:
Set con = New LCConnection("oracle")
 
con.Server = conServer
con.Userid = conUser
con.Password = conPswd
con.Connect
 
qry = {SELECT * ...}
Call Con.Execute (qry, result)
While continue 
If  (con.Fetch (result) > 0) Then
total_entries = total_entries +1
Else
continue = False
End If
Wend
 

swyatogor

Lotus team
24.02.2014
478
10
#18
@Xalet, я так понимаю что "oracle" - это настроенное подключение? вот как раз этого и хотелось избежать
 
Последнее редактирование модератором:

savl

Lotus team
28.10.2011
2 135
104
#20
Еще вариант, без программного подключения к oracle

Купить LEI
настроить
гнать как хочется в промежуточную LN базу
обрабатывать как требуется
=)