1

Тема: JS: ошибка при закрытии объекта Recordset

не могу разобраться почему в таком коде:

var AdoRs = new ActiveXObject("ADODB.Recordset");
var sSource =  "INSERT INTO UseVariant VALUES(1, 10, 100)";    
var sConnect = "driver={SQL Server};server=NHMS241\\ITSQL;database=TFD8;Username=sa;PWD=%LcGhjvj%";
try
    {
    AdoRs.open(sSource, sConnect);            
    WScript.Echo("Данные внесены в таблицу");
    AdoRs.close();                              // попытка закрытия объекта Recordset всегда вызывает ошибку
                                                                      // и выполнение перейдёт в catch
    }
catch(err)
    {
    WScript.Echo("Ошибка открытия БД\n" + err.message);
    WScript.Quit();                    
    }

инструкция AdoRs.close() вызывает переход в catch с ошибкой: "Операция не допускается, если объект закрыт"???
Данные в таблицу при этом вносятся... Внесли данные - закрыли объект Recordset... я так понимаю.
Если вместо запроса на изменение данных поставить запрос на выборку, к примеру:

var sSource =  "select * from UseVariant";

то никакой ошибки уже не возникает в  AdoRs.close()

2

Re: JS: ошибка при закрытии объекта Recordset

im2002, причина в том, что соединение в таком случае уже само закрылось. Если Вы не используете данные, возвращённые из запроса, то Вам проще использовать объект ADODB.Connection и его метод Execute. А возможно, ещё лучше, ADODB.Command. В принципе, он может даже дать выигрыш в скорости. Так как в нём можно сразу явно указать:
1) к чему вы собираетесь обращаться - процедура / таблица / функция и т.п.
2) Тип данных для каждого из переданных параметров.


var oDbCn = new ActiveXObject("ADODB.Connection")
oDbCn.Open("driver={SQL Server};server=NHMS241\\ITSQL;database=TFD8;Username=sa;PWD=%LcGhjvj%");
var oDbRs = oDbCn.Execute("select * from UseVariant");
WScript.Echo(oDbRs.EOF)

P.S Кстати для Recordset в методе Open, вторым параметром предпочтительнее использовать созданное и открытое подключение - экземпляр объекта ADODB.Connect. Это так же ускоряет работу.

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

3

Re: JS: ошибка при закрытии объекта Recordset

Xameleon пишет:

im2002, причина в том, что соединение в таком случае уже само закрылось.

вот и непонятно как оно вдруг "само закрылось"...

4

Re: JS: ошибка при закрытии объекта Recordset

im2002 пишет:

вот и непонятно как оно вдруг "само закрылось"...

Open Method (ADO Recordset):


It is not a good idea to use the Source argument of the Open method to perform an action query that does not return records because there is no easy way to determine whether the call succeeded. The Recordset returned by such a query will be closed. To perform a query that does not return records, such as a SQL INSERT statement, call the Execute method of a Command object or the Execute method of a Connection object instead.