1

Тема: VBS + ODBC: Количество полей в запросе

Добрый день.

Использую Firebird ODBC + VBScript

Возникла необходимость перебрать все результаты в запросе, при этом количество полей не известно.

Пример:


Set FB = CreateObject("ADODB.Connection")

FB.Open "DataBase"

Query = "Select * From StoredProcedure"

Set Res = FB.Execute(Query)

While Not Res.EOF
  a1 = Res.Fields(0).Value
  a2 = Res.Fields(1).Value
...
  aX = Res.Fields(X).Value

  Res.MoveNext
WEnd

StoredProcedure могут быть любыми и, соответственно, возвращать произвольное количество столбцов.
aX = Res.Fields(X).Value
Как узнать, чему равно Х для данной StoredProcedure?

Я очень надеюсь на ответ типа:
Используй

ColumnCount = Res.ColumnCount()

, по аналогии с количеством строк

Res.Fields.Count

но, к сожалению, не смог нагуглить ничего подобного...

Спасибо.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

2

Re: VBS + ODBC: Количество полей в запросе

Res.Fields.Count возвращает количество полей ("столбцов"), разве не так?

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

3

Re: VBS + ODBC: Количество полей в запросе

'<...>
Set Catalog = CreateObject("ADOX.Catalog")
Set Catalog.ActiveConnection = FB
For Each Table In Catalog.Tables
  MsgBox Table.Name & vbnewline & Table.Columns.Count
Next

?

4

Re: VBS + ODBC: Количество полей в запросе

select count(*) from blabla

Можно так получить количество. И да, .RecordsCount возвращает -1 (что я только не пробовал).

Автоматизирую торговлю. Не 1С

5

Re: VBS + ODBC: Количество полей в запросе

omegastripes пишет:

Res.Fields.Count возвращает количество полей ("столбцов"), разве не так?

В том то и дело, что это возвращает количество строк, а не столбцов.

Mat Skywalker пишет:

select count(*) from blabla

Так, конечно, можно получить количество, но тоже только строк, а не колонок (столбцов).
К тому же, данный вариант плох ещё и по другой причине. Если хранимая процедура blabla вносит изменения в базу, то её повторный запуск уже даст другой результат.

Flasher пишет:

Set Catalog = CreateObject("ADOX.Catalog")

С этим я ещё не сталкивался, судя по коду - то, что нужно, лишь бы заработало. Проверю.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

6

Re: VBS + ODBC: Количество полей в запросе

Flasher пишет:
'<...>
Set Catalog = CreateObject("ADOX.Catalog")
Set Catalog.ActiveConnection = FB
For Each Table In Catalog.Tables
  MsgBox Table.Name & vbnewline & Table.Columns.Count
Next

?

А счастье было так близко и так возможно...
К сожалению, эта конструкция выдаёт список таблиц в базе.
В общем, мимо...

Вопрос открыт.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

7

Re: VBS + ODBC: Количество полей в запросе

Откуда список? Каждое окно должно выдавать имя каждой таблицы и число её столбцов.

8

Re: VBS + ODBC: Количество полей в запросе

Да, но это всё-равно не то, что нужно.
У меня запрос к хранимым процедурам, которые джоинятся между собой и таблицами.
Мне нужно подсчитать и перебрать количество столбцов на выходе селекта.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

9

Re: VBS + ODBC: Количество полей в запросе

Не уверен, но можно попробовать перед циклом это добавить:

Set Comm = CreateObject("ADODB.Command")
Comm.CommandText = Query
Catalog.Views.Append "NewQuery", Comm

10

Re: VBS + ODBC: Количество полей в запросе

Flasher пишет:

Не уверен, но можно попробовать перед циклом это добавить:

Set Comm = CreateObject("ADODB.Command")
Comm.CommandText = Query
Catalog.Views.Append "NewQuery", Comm

А что это даст?

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

11

Re: VBS + ODBC: Количество полей в запросе

Метод Append добавляет в коллекцию Views данные в соответствии с запросом.
Только надо сперва проверить как изменится Catalog.Views.Count после добавления нового представления. Если оно меняется, то можно вычислить разницу между исходным и суммированным числом столбцов. Хотя, вероятно, есть способ попроще.

12

Re: VBS + ODBC: Количество полей в запросе

Хотелось бы по проще...
Неужели никто такой мыслью не заморачивался?

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

13

Re: VBS + ODBC: Количество полей в запросе

Сперва всё же проверьте:

Set Catalog.ActiveConnection = FB  ' следом
MsgBox Catalog.Views.Count   ' результат, отличный от нуля?

14

Re: VBS + ODBC: Количество полей в запросе

MikeSh пишет:
omegastripes пишет:

Res.Fields.Count возвращает количество полей ("столбцов"), разве не так?

В том то и дело, что это возвращает количество строк, а не столбцов.

Явно ошибаетесь.

Res.Fields.Count - возвращает кол-во полей.

Res.RecordCount - возвращает кол-во полученных в результате запроса записей.

RecordCount может возвращать -1 в случае если курсор связи с базой данных серверный. И это логично. При этом клиентская сторона не знает сколько записей вернёт запрос и обращение к следующей записи по MoveNext инициирует новый запрос к БД. В случае если курсор связи с БД клиентский, то в результате запроса все записи выгружаются на клиента и при этом RecordCount возвращает реальное кол-во полученных записей. Есть ещё условия при которых RecordCount возвращает -1, но об этом лучше почитать тут - http://msdn.microsoft.com/en-us/library … s.85).aspx


P.S В базе данных нет строк и столбцов. ) Есть записи и поля этих записей.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

15

Re: VBS + ODBC: Количество полей в запросе

/me испытывает стыд и позор.

Написал кучу текста для оправдания поста, стёр, т.к. нет оправдания.

Res.Fields.Count - то, что и требуется.
Спасибо всем большое.

P.s. Отдельное спасибо за RecordCount

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.