Lotus и MS SQL (LCConnection)

nayke

Well-Known Member
04.08.2010
310
0
#1
Соединяюсь с базой - запускаю хранимую процедуру. Получаю одну запись.
Код:
		Dim LCRecord As new Lcfieldlist
Dim LCField As Lcfield
Dim fff As Boolean
fff = LCC.Execute({EXEC proc 1,1,'text',''}, LCRecord)
MsgBox LCRecord.Recordcount ' вывыодится единица
If (LCC.Fetch(LCRecord) > 0) Then
Set LCField=LCRecord.Getfield(1)
ExecuteProcedure$ = LCField.Value(0)
End If
На методе Fetch ловлю ошибку
---------------------------

---------------------------
Err EXECUTEPROCEDURE / 260 / 12316 Error: This operation requires an active result set, Connector 'oledb', Method -Fetch-
---------------------------
ОК
---------------------------
нашел в редбуке:

A requested LCConnection operation cannot be performed unless the connection has an active result set. Produce a result set before attempting this operation. This error is generally produced by calling LCConnection.Fetch without a previous call to a method which produces a result set (such as Execute, Select, Call, or Catalog).

Но в данном случае метод Execute отработал, что-то вернул соединие есть..

Подскажите у кого какие идеи.. что-то у меня ресурс на сегодня закончен.
 

nayke

Well-Known Member
04.08.2010
310
0
#3
Переход на ADO как последний из вариантов конечно возможен.. но не хотелось бы заново переписывать все под другой драйвер, да и не 100%, что все заработает. Поэтому пока бьемся с LCConnection.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#4
Переход на ADO как последний из вариантов конечно возможен.. но не хотелось бы заново переписывать все под другой драйвер, да и не 100%, что все заработает. Поэтому пока бьемся с LCConnection.
Работать будет 100 % если хранимки правильно написаны.
Ну и красота метода - не нужны никакие ODBC коннекторы.
 

nayke

Well-Known Member
04.08.2010
310
0
#5
Работать будет 100 % если хранимки правильно написаны.
Ну и красота метода - не нужны никакие ODBC коннекторы.
С LCConnection Вроде как тоже не нужны) и логики много уже описано.

А есть пример процедуры запуска хранимки чтобы "на лету" попробовать?
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#8
Работать будет 100 % если хранимки правильно написаны.
Ну и красота метода - не нужны никакие ODBC коннекторы.
И на Линуксе будет работать вся эта красота?

nayke
Переходить на ADO не советовал бы! Это даунгрейд.
У меня цикл организован вот так:
<!--shcode--><pre><code class='ls'>While Me.m_LCConnector.LCC.Fetch(LCRecord) 'Fetch вытягивает данные в LCRecord
Set LCField = LCRecord.Lookup(FieldName) 'получаем поле по имени
If Not LCField Is Nothing Then
' = LCField.Value()
'...
Else
'Здесь запись об ошибке: "Ошибка выполнения хранимой процедуры: в возвращаемой записи отсутствует необходимое поле"
End If
Wend[/CODE]Для Oracle работает.
По MsSQL, надеюсь, что ребята, работавшие с ним, подскажут.
 

nayke

Well-Known Member
04.08.2010
310
0
#9
И на Линуксе будет работать вся эта красота?

nayke
Переходить на ADO не советовал бы! Это даунгрейд.
У меня цикл организован вот так:
<!--shcode--><pre><code class='ls'>While Me.m_LCConnector.LCC.Fetch(LCRecord) 'Fetch вытягивает данные в LCRecord
Set LCField = LCRecord.Lookup(FieldName) 'получаем поле по имени
If Not LCField Is Nothing Then
' = LCField.Value()
'...
Else
'Здесь запись об ошибке: "Ошибка выполнения хранимой процедуры: в возвращаемой записи отсутствует необходимое поле"
End If
Wend[/CODE]Для Oracle работает.
По MsSQL, надеюсь, что ребята, работавшие с ним, подскажут.
Так вот у меня на Fetch как раз и падает.. хотя без хранимых процедур - Select и Catalog, а затем Fetch нормально работает.
Для out параметров нет какой-то специфики?
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#10
Хранимая процедура внутри себя может не найти записей, в этом случае корректнее всего формировать ложную (пустую) запись внутри хранимой процедуры и возвращать её, а после Fetch уже анализировать на пустоту записи. Как это сделать в хранимой процедуре - не знаю, у нас это ораклоиды делали.
 

nayke

Well-Known Member
04.08.2010
310
0
#11
Хранимая процедура внутри себя может не найти записей, в этом случае корректнее всего формировать ложную (пустую) запись внутри хранимой процедуры и возвращать её, а после Fetch уже анализировать на пустоту записи. Как это сделать в хранимой процедуре - не знаю, у нас это ораклоиды делали.
так вроде записи она возвращает. У меня такой вопрос
Код:
 fff = LCC.Execute({EXEC proc 1,1,'text',''}, LCRecord)
последний параметр OUT - я прото передаю '' возможно это некорректно?


И еще решил изменить execute на Call, получил:
Код:
LCC.Procedure=MSPrBody		
Dim Parms As New LCFieldList
Dim Result As New LCFieldList
Dim Parm As LCField
Dim Res As LCField

LCC.Fieldnames="ID_in1, ID_in2, in3, Result"
Set Parm=Parms.Append("ID_in1", LCTYPE_FLOAT)
Parm.value=1
Set Parm=Parms.Append("ID_in2", LCTYPE_FLOAT)
Parm.value=2
Set Parm=Parms.Append("in3", Lctype_text) 
Parm.value= {'text'} 
Set Parm=Parms.Append("Result", Lctype_text) 
Parm.value= {""}

Call LCC.Call (Parms, 1, Result)

Set Res = Result.Lookup("Result")
If (LCC.Fetch (Result) > 0) Then
StorageProc = Res.value(0)
End If
при вызове метода Call получаю
---------------------------

---------------------------
Err STORAGEPROC / 282 / 12325Error:

ErrorRecord: HResult: 0x80040e14

Description: Invalid parameter 7 (''): Data type 0x23 is a deprecated large object,
---------------------------
ОК
---------------------------

Уже начинаю коситься на хранимку.
Сталкивался кто с таким?
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#12
nayke
Отпишись, как решил проблему. Удалось ли нормально работать с MS SQL с помощью LCConnection?