Консультация № 170965
31.07.2009, 22:28
0.00 руб.
0 8 3
Здравствуйте!
Проблема такая. На vbs подключаюсь к MS SQL. Делаю запрос, для простоты решим что получаю только одно значение в результате выполнения запроса . Не важно какого. Важно другое.
Если результат запроса возвращает хоть что-то, или NULL то это можно анализировать - работает if IsNull(recordset) = True или просто из recordset можно взять значение.
Но! Если запрос вообще не возвращает значений - как отследить это? Is Null уже не работает. Есть мысль просто проверить число возвращаемых строк в recordset и если меньше 1 то значит запрос значений не возвратил. Но как это сделать, подскажите?

Обсуждение

давно
Модератор
137394
1850
01.08.2009, 12:36
общий
это ответ
Здравствуйте, ALEX_SE. Ответ:

N_Eta_Rec = Recset.RecordCount

К сожалению, дома у меня нет базы MS SQL. Для проверки ответа воспользовался тем, что было под руками.
Но это и не принципиально. Вот пример, который организует запрос к DBF-таблице и подсчитывает число записей в курсоре выбранных данных. У Вас будет, естественно, свой способ подсоединиться к базе данных MsSql.
Тип курсора -статический.
Код:
' Скрипт делает запрос к таблице DBF 
' В выбранных данных подсчитывается число строк

Eta = "Banks" ' Имя таблицы .dbf
Eta_Dir = "P:\Scripts" ' Путь к таблице .dbf

' Драйверы на соединение с таблицами
Eta_Connect = "Driver={Microsoft dBase Driver (*.dbf)};DefaultDir=" + Eta_Dir

' Получим кодичество записей таблицы

Set Recset = CreateObject("ADODB.Recordset")
Recset.CursorType = 3

' Recset.Open "Select * From " + Eta, Eta_Connect
Recset.Open "Select * From " + Eta + " Where MFO='NNNNNNNNN'", Eta_Connect

N_Eta_Rec = Recset.RecordCount

Set WS = CreateObject("WScript.Shell")

Mess = MsgBox(N_Eta_Rec)
При ответе использовал книгу
А.Попов
Windows Script Host для Windows 2000/XP
"БХВ-Питербург" 2003г.
5
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
01.08.2009, 13:21
общий
Megaloman:
Спасибо! Вопросов с подсоединением нет, вопрос только как отловить момент если рекордсет ничего не возвратил. Про свойство RecordCount я не знал, большое спасибо!
p.s. у меня есть эта книжка :)
давно
Модератор
137394
1850
01.08.2009, 15:34
общий
p.s. у меня есть эта книжка
см. стр 424 Курсор образуется в любом случае, если только запрос работает корректно. Нуль отобранных записей тоже получается.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
02.08.2009, 21:04
общий
это ответ
Здравствуйте, ALEX_SE.
Я не специалист по Visual Basic, но эта ситуация встречается для разных языков программирования и баз данных, поэтому могу предложить другой вариант решения этой проблемы. Скорее всего в Visual Basic тоже есть какой-то аналог "ИЛИ" - или or, или ||, или какой-то свой вариант. То есть, например, после выполнения запроса присвоить переменной полученное значение ИЛИ какое-то заданное значение:
test=query || 'nothing'
Тогда если результат запроса будет определен, то это значение будет присвоено, если нет - то Ваше альтернативное, и Вы сможете всегда определить, что именно произошло.
Удачи!
4
Неизвестный
02.08.2009, 22:21
общий
это ответ
Здравствуйте, ALEX_SE.
в дополнение ответа Megaloman
в отсутствии записей можно убедиться проверив EOF
Код:
Set Recset = CreateObject("ADODB.Recordset")
sConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=sDB;Data
Source=sqlServer"
sSQL = "SELECT * FROM tbl"
Recset.Open sSQL, sConnect
If Recset.EOF Then MsgBox "Not record", vbOKOnly, ""
Евгений
5
Неизвестный
03.08.2009, 07:26
общий
lupus campestris:
Да собственно так и делаю но как-то кривовато получается :)
Неизвестный
03.08.2009, 07:30
общий
Тесленко Евгений Алексеевич:
Кхм. Действительно. Про EOF мог бы и сообразить. Собственно так я делаю, while until rs.eof ../мои подзапросы результат которых сравнивается с данными полученными в rs и которые иногда не возвращают значений/.. rs.movenext loop. Про то что тот же механизм можно использовать и внутри не догадался. Спасибо :)
Вот так бывает когда раз в полгода что-то сделать пытаешся.
Неизвестный
03.08.2009, 10:54
общий
ALEX_SE:
Наоборот, это не кривовато, а универсальное решение. :)
Форма ответа