Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как получить редактируемый Recordset из UDF / 6 сообщений из 6, страница 1 из 1
08.08.2018, 12:15
    #39684743
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
Есть MDB со связанными на SQL Server таблицами. На сервере UDF типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE FUNCTION [dbo].[TestUDF]
(	
	@forCode int
)
RETURNS TABLE 
AS
RETURN 
(
	SELECT top (100) PERCENT * FROM Box WHERE Box.Code=@forCode
)


Как из неё получить редактируемый Recordset ?
Я пытался, так же как открываю SP:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
Public Function OpenSP(ByVal name As String, cmdType As ADODB.CommandTypeEnum, ParamArray ParamsAndValues()) As ADODB.Recordset
    Dim e As Error
    Dim cnn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim param As ADODB.Parameter
    Dim rst As ADODB.Recordset
    Dim expr As String
    Dim I As Long
        
On Error GoTo err_me

    Set cnn = New ADODB.Connection
    cnn.Open ConnString
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cnn
    
    Set rst = New ADODB.Recordset
    Set rst.ActiveConnection = cnn
    
    cmd.CommandText = name
    cmd.CommandType = cmdType
    cmd.NamedParameters = True
    
    ' evaluated params 
On Error Resume Next
    For Each param In cmd.Parameters
        If param.Direction = adParamInput Or param.Direction = adParamInputOutput Then
            expr = GetOriginalName(param.name)
            param.Value = Eval(expr)
        End If
    Next param
On Error GoTo err_me
    'passed params
    For I = LBound(ParamsAndValues) To UBound(ParamsAndValues) Step 2
        Set param = cmd.Parameters("@" & ParamsAndValues(I))
        param.Value = ParamsAndValues(I + 1)
    Next I
    
    rst.CursorType = adOpenDynamic
    rst.CursorLocation = adUseClient
    rst.Open cmd
    
    Set OpenSP = rst

exit_me:
    Exit Function
err_me:
    Debug.Print Now, Err.Number, Err.Description
    For Each e In DBEngine.Errors
        Debug.Print "", e.Number, e.source, e.Description
    Next e
    Debug.Print , , name
    Debug.Assert False
    Err.Clear
    Resume exit_me
End Function


Вызов
Код: vbnet
1.
?openSP("TestUDF",adCmdText ,"forCode",7777).RecordCount 


Но ошибка уже на этапе работы с коллекцией параметров.
...
Рейтинг: 0 / 0
08.08.2018, 12:31
    #39684767
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
Забив на коллекции и вызывая через текст
Код: vbnet
1.
2.
3.
4.
    Dim rst As ADODB.Recordset
    Set rst = OpenSP("SELECT * FROM TestUDF(7777)", adCmdText)
    rst![testField] = 1
    rst.Update


получаю ошибку
Visual BasicТекущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.
Хотя задано
Код: vbnet
1.
2.
    rst.CursorType = adOpenDynamic
    rst.CursorLocation = adUseClient


провайдер в строке подключения "SQLNCLI11"
...
Рейтинг: 0 / 0
08.08.2018, 13:14
    #39684794
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
В варианте с текстовым запросом ошибку нашёл и исправил - не хватало
Код: vbnet
1.
    rst.LockType = adLockOptimistic


а вот как к коллекции параметров добраться при обращении по имени UDF - не разобрался.
...
Рейтинг: 0 / 0
08.08.2018, 16:18
    #39684921
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
Разобрался: имя UDF надо ставить в квадратные скобки.
...
Рейтинг: 0 / 0
09.08.2018, 18:04
    #39685696
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
Магия перестала работать: для cmd.CommandType = adCmdTable при cmd.CommandText = "[ИмяUDF]" коллекция cmd.Parameters пуста.
...
Рейтинг: 0 / 0
10.08.2018, 14:25
    #39686088
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить редактируемый Recordset из UDF
Вышел из ситуации так: создаю ещё одну временную Команду, ей ставлю CommandType = adCmdStoredProc , перебираю её параметры, и для исходной через Parameters.Append и CreateParameter задаю соответствующие параметры. После чего для исходной команды подменяю в тексте [имяUDF] на [имяUDF](?,?,?....?,?).
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как получить редактируемый Recordset из UDF / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]