powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / EXCEL Функция возвращающая RecordSet
15 сообщений из 15, страница 1 из 1
EXCEL Функция возвращающая RecordSet
    #39639381
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello world!
Ниже представлен код ф-ции, которая должна возвращать набор
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Function F_Exec_SQL_ToRcdSet(ConString As String, CommandText As String) As ADODB.Recordset
' Процедура выполняет SQL запрос, результат которого возвращает как Recordset

    'ConString - строка подключения
    'CommandText - текст запроса
    
    Dim Cmd As ADODB.Command
    Dim Con As Connection
    
    Set Con = New ADODB.Connection
        Con.CommandTimeout = 1000000
        Con.ConnectionString = ConString
        Con.CursorLocation = adUseClient
    Con.Open
    
    Set Cmd = CreateObject("ADODB.Command")
        Cmd.CommandTimeout = 1000000
        Cmd.CommandType = adCmdText
        Cmd.ActiveConnection = Con

    Set Exec_SQL_ToRcdSet = Con.Execute(CommandText)

End Function



При вызове этой функции она ничего не возвращает.
Предполагаю, что при выходе из F_Exec_SQL_ToRcdSet закрывается курсор.
Верно ли мое предположение?

Как можно вернуть набор?
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639384
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До выхода F_Exec_SQL_ToRcdSet
в наборе есть записи
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639393
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрустальный шар на техобслуживании

1) Что в ConString?
2) Нет ли On Error Resume Next в вызывающем коде?
3) Используется ли Option Explicit?
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639397
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по хорошему Yagrus2
Код: vbnet
1.
Set Cmd.ActiveConnection = Con

но это вряд ли влияет. Ваше предположение неверно - работать должно.
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639420
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro1) Что в ConString? Строка подключения к sql-серверу
Shocker.Pro2) Нет ли On Error Resume Next в вызывающем коде? Нет
Shocker.Pro3) Используется ли Option Explicit? Нет

Это процедура из которой вызываю
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub Calc_InSql_MapingOrgName_Put_ToExcel_Forum()
    ' Строка подключения
    Dim ConString As String
        ConString = "Driver=SQL " & "Server;Server=N01000039;Database=TD"
    ' Текст команды SQL запроса
    Dim CommandText As String
    ' Массив параметров необходимых для выполнения SQL запроса. Из него формируется CommandText
    Dim MasParams() As String
    ReDim MasParams(1 To 1000, 1 To 5)

    CommandText = F_CommandText("EXEC", "[dbo].[SP_Report_Дебиторка_Organisation_WithoutMaping]", MasParams())
        DoEvents
    Dim RcdSet As ADODB.Recordset
    Set RcdSet = F_Exec_SQL_ToRcdSet(ConString, CommandText)
 
    CountCol = Val(RcdSet.Fields.Count)
    CountRow = Val(RcdSet.RecordCount)

End Sub


Функция F_CommandText возвращает текст запроса "EXEC [dbo].[SP_Report_Дебиторка_Organisation_WithoutMaping] "

На sql-сервере данный запрос отрабатывает(Смотрю через профайлер)


на строке CountCol(во внешней процедуре) RcdSet - Notthing
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639438
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2Shocker.Pro3) Используется ли Option Explicit? НетОно
http://www.sql.ru/faq/faq_topic.aspx?fid=2539
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639476
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
К сожалению включение данной опции не помогло найти ошибку. Ниже код процедур
Код: 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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
Option Explicit

Sub Calc_InSql_MapingOrgName_Put_ToExcel_Forum()

    ' Строка подключения
    Dim ConString As String
        ConString = "Driver=SQL " & "Server;Server=N01000039;Database=TD"
    ' Текст команды SQL запроса
    Dim CommandText As String
    ' Массив параметров необходимых для выполнения SQL запроса. Из него формируется CommandText
    Dim MasParams() As String
    ReDim MasParams(1 To 1000, 1 To 5)

    CommandText = F_CommandText("EXEC", "[dbo].[SP_Report_Дебиторка_Organisation_WithoutMaping]", MasParams())

        DoEvents
    ' В этот курсор попадают организации, по которым нет мапинга в SQL - таблице.
    Dim RcdSet As ADODB.Recordset
    Set RcdSet = F_Exec_SQL_ToRcdSet(ConString, CommandText)
    
    Dim CountCol, CountRow As Integer
    CountCol = Val(RcdSet.Fields.Count)
    CountRow = Val(RcdSet.RecordCount)

End Sub

Function F_Exec_SQL_ToRcdSet(ConString As String, CommandText As String) As ADODB.Recordset
' Процедура выполняет SQL запрос, результат которого возвращает как Recordset

    'ConString - строка подключения
    'CommandText - текст запроса
    
    Dim Cmd As ADODB.Command
    Dim Con As Connection
    
    Set Con = New ADODB.Connection
        Con.CommandTimeout = 1000000
        Con.ConnectionString = ConString
        Con.CursorLocation = adUseClient
    Con.Open
    
    Set Cmd = CreateObject("ADODB.Command")
        Cmd.CommandTimeout = 1000000
        Cmd.CommandType = adCmdText
        Cmd.ActiveConnection = Con
    
    Dim RcdSet As New ADODB.Recordset
    Set RcdSet = Con.Execute(CommandText)

End Function


Function F_CommandText(TypeComand As String, SqlObject As String, MasParams() As String)
' Ф-ция возвращающая SQL-команду

    ' TypeComand - Тип SQL команды: INSERT; EXEC
    ' SqlObject  - Объект SQL, который участвует в SQL - запросе
    ' StrParams  - Мыссив параметров, содержащий значения параметров небходивых для SQL - запроса
    
    Dim CommandText As String ' Текст SQL команды
    Dim StrParams As String  ' Сконкатенированная строка параметров
    Dim x, y, i As Integer
    
    x = UBound(MasParams, 1)
    y = UBound(MasParams, 2)
    
    If x = 1 Then
        StrParams = "'"
        For i = 1 To y
            StrParams = StrParams & MasParams(1, i)
            If i < y Then
            StrParams = StrParams & "', '"
            End If
        Next
        StrParams = StrParams & "'"
    ElseIf x = 1000 Then
        StrParams = " "
    End If
    
    If TypeComand = "INSERT" Then
        CommandText = "INSERT INTO " & SqlObject & " VALUES (" & StrParams & ")"
    ElseIf TypeComand = "EXEC" Then
        CommandText = "EXEC " & SqlObject & StrParams
    End If
    
    F_CommandText = CommandText

End Function
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639478
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Провел еще такой эксперимент.
В проблемной ф-ции F_Exec_SQL_ToRcdSet, добавил еще один параметр типа ADODB.Recordset. Передаю его как ссылку из внешней процедуры(Calc_InSql_MapingOrgName_Put_ToExcel_Forum).
Меняю его значение этого параметра на Con.Execute(CommandText)

Может при выходе из F_Exec_SQL_ToRcdSet все таки курсор закрывается?
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639479
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя функция F_Exec_SQL_ToRcdSet ничего не возвращает (точнее, возвращает Nothing), что ты и наблюдаешь в отладчике
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639481
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639505
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProУ тебя функция F_Exec_SQL_ToRcdSet ничего не возвращает (точнее, возвращает Nothing), что ты и наблюдаешь в отладчике
Спасибо! увидел.

Проблема исчерпана. Скорее всего, я ощибся на этапе возвращаемого значения.
Спасибо за помощь!
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39639506
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2я ощибся на этапе возвращаемого значения.от этого как раз и страхует Option Explicit - рекомендую пользоваться этим постоянно
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39641858
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Еще раз хотел поблагодарить за ваш совет с Option Explicit
Пересмотрев еще раз топик и увидел, что в функции из первого сообщения, Recordset кладется в необъявленную переменную.
А должен возвращаться
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39641883
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2Еще раз хотел поблагодарить за ваш совет с Option Explicit
Пересмотрев еще раз топик и увидел, что в функции из первого сообщения, Recordset кладется в необъявленную переменную.
А должен возвращатьсяТак вот, когда я заметил эту ошибку, а заметил я ее не сразу - визуально это сделать сложно, я посоветовал Option Explicit, полагая, что ошибку вы поймете сразу. Но вы вместо этого объявили локальную переменную и я подумал, что вы не знаете, как возвращать значение из функции, поэтому отправил вас читать учебник
...
Рейтинг: 0 / 0
EXCEL Функция возвращающая RecordSet
    #39641999
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
    Set Cmd = CreateObject("ADODB.Command")
        Cmd.CommandTimeout = 1000000
        Cmd.CommandType = adCmdText
        Cmd.ActiveConnection = Con



этот кусок у вас функции ничего не делает, зачем он там?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / EXCEL Функция возвращающая RecordSet
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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