powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как получить редактируемый Recordset из UDF
6 сообщений из 6, страница 1 из 1
Как получить редактируемый Recordset из UDF
    #39684743
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 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
Как получить редактируемый Recordset из UDF
    #39684767
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забив на коллекции и вызывая через текст
Код: 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
Как получить редактируемый Recordset из UDF
    #39684794
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В варианте с текстовым запросом ошибку нашёл и исправил - не хватало
Код: vbnet
1.
    rst.LockType = adLockOptimistic


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


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