1

Тема: ADO Recordset, работа и курсоры.

Продолжая цепочку нубских вопросов прошу помочь разобраться с объектом Recordset.

 
var Record = new ActiveXObject("ADODB.Recordset");
 var sh = new ActiveXObject("WScript.Shell");
 Record.ActiveConnection = "Provider=SQLOLEDB;Data Source=.\\SQLEXPRESS;Initial Catalog=BarcodeToCity;User ID=sa;Password=111;";
 Record.Source = ("SELECT CityID FROM exporttable")
 Record.Open();
 while (Record.EOF==false) {
 for(var i=0; Record.Fields.Count-1; i++){
 if(Recordset.Fields(i).Value == "City10"){
 Wscript.Echo(i);} 
 }
Record.MoveNext;
 }
   

На сколько я понимаю, объект должен сохранять в себя результат запроса в том виде, в котором нам бы его выдала БД, тоесть в виде таблички. Изначально курсор выставляется в самый левый верхний угол и после MoveNext опускается на ступеньку вниз , а Record.Fields это записи в колонках.

Мне интересно: Мы, например сделали запрос, который достает целую колонку с названием городов(могут повторяться) "SELECT CityID FROM exporttable"  А теперь мне надо посмотреть, сколько в этой колонке городов с названием  "City10" . 
Указанный выше код не работает, как исправить, и вообще правильно ли я понимаю работу объекта?
Очень был бы признательный за объяснения, не то описания чистых манов мне немного не достаточно(

2

Re: ADO Recordset, работа и курсоры.

Изначально курсор выставляется в самый левый верхний угол

Неверная трактовка. Лева и права в наборе записей нет. Есть только первая запись, последняя, текущая.

а Record.Fields это записи в колонках.

Только не записи (запись — это как раз вся строка целиком), а поля. Доступ есть только к полям текущей записи.

А теперь мне надо посмотреть, сколько в этой колонке городов с названием  "City10" .

Быстрее и проще выполнить ещё один запрос с условием. Либо воспользоваться фильтрацией, если провайдер позволяет.

Указанный выше код не работает, как исправить, и вообще правильно ли я понимаю работу объекта?

Нет, неправильно.

iCount = 0;
while (!Record.EOF) {
    If(Recordset.Fields.Item("CityID").Value == "City10") {
        iCount+=1;
    } 
    
    Record.MoveNext;
}

Wscript.Echo(iCount);

3

Re: ADO Recordset, работа и курсоры.

Еще раз спасибо за разъяснения, все что нужно было теперь получилось.

4 (изменено: -Lesnik-, 2013-05-22 15:49:08)

Re: ADO Recordset, работа и курсоры.

С разрешения автора продолжу задавать нубские вопросы:

Есть такой код

'коннектимся к ComGate
objComGateCommand.CommandText =  "<LDAP://" & strComGateServerIP & ":" & strComGatePort & "/" & _
strComGateBeseDN & ">;" & strComGateFilter &  ";uid,cn,telephoneNumber;subtree"

Set objComGateUsers = objComGateCommand.Execute

WScript.Echo objComGateUsers.RecordCount

Do Until objComGateUsers.EOF
    If IsArray(objComGateUsers.Fields(0).value) Then
        WScript.Echo objComGateUsers.Fields("cn").name
    end if
    'WScript.Echo objComGateUsers.Fields("uid").Value
    'WScript.Echo objComGateUsers.Fields("cn").Value

objComGateUsers.MoveNext
Loop

Вот эта запись дает

    'WScript.Echo objComGateUsers.Fields("uid").Value

такую ошибку

Ошибка: Несоответствие типа

Насколько я понимаю там возвращается массив.
Как мне к нему обратиться? И если не массив, то как добраться то внутренностей?

З.Ы.
На пхп этот код у меня выглядит так:

echo $user[$i][$v][0];

Где $i - номер записи, $v - имя атрибута
На VB никогда не писал.

5

Re: ADO Recordset, работа и курсоры.

Сам допетрил)

fio = join(objComGateUsers.Fields("cn").value)
WScript.Echo fio