![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
NextRecordset(RecordsAffected). Что возвращает RecordsAffected? [D7, MSSQL]
Bless © (2004-11-08 12:34:00)Цитата из MSDN:
RecordsAffected
Optional. A Long variable to which the provider returns the number of records that the current operation affected.
Note This parameter only returns the number of records affected by an operation; it does not return a count of records from a select statement used to generate the Recordset.
Объясните, плз, разницу между
number of records affected by an operation
и
count of records from a select statement used to generate the Recordset
Разве в случае select-а это не одно и те же?
А то при ADODataSet1.commandtext равном 'select * from t1 select * from t2'
после строчки ADODataSet1.NextRecordset(i) у меня всегда i=-1.
Что, параметр RecordsAffected всегда равен -1 для select и будет отличным от -1 только для команд типа insert, update?
И еще
про метод NextRecordset написано, что он
Clears the current Recordset object and returns the next Recordset by advancing through a series of commands.
Как понимать слова Clears the current Recordset object?
Bless (2004-11-08 15:39:00) [1]>выходит так... ;о)
Аж от сердца отлегло :) А то я думал, у меня что-то криво растет.
А просмотр исходной реализации функции не помогает понять, в чем ошибка, имхо. Ведь внутри все-равно вызывается функция интерфейса (или как это правильно называется) RecordSet.NextRecordSet.
И это именно про него в MSDN написано
Clears the current Recordset object and returns the next Recordset by advancing through a series of commands.
Выходит, ошибка в MSDN.
sniknik (2004-11-08 14:28:00) [2]> То есть выходит, что вызов метода NextRecordset реально старый рекордсет не чистит? Или где я ошибаюсь?
выходит так... ;о) а ошибка (сам тоже недоглядел), это же функция! стоит посмотреть на исходную реализацию
function TCustomADODataSet.NextRecordset(
var RecordsAffected: Integer): _Recordset;
var
VarRecsAffected: OleVariant;
begin
CheckBrowseMode;
Result := RecordSet.NextRecordSet(VarRecsAffected);
RecordsAffected := VarRecsAffected;
end;
чтобы понять в чем ошибка (второй вызов у тебя правильный)
Bless (2004-11-08 14:14:00) [3]>прямо, старый рекордсет очишается когда на его место следующий
>приходит, нигде не сохраняется
cmd.CommandText:='select * from t1 select * from t1 where 1=0';
ADODataSet1.Recordset:=cmd.execute(recordsAffected, EmptyParam);
showmessage(inttostr(AdoDataset1.RecordCount));
ADODataSet1.NextRecordset(recordsAffected);
showmessage(inttostr(AdoDataset1.RecordCount));
В приведенном фрагменте на экран выскакивают два message-а:3 и 3 (число записей в t1 = 3). Хотя, если бы старый рекордсет очищался, то вторым message-ем очевидно должен бы быть 0.
А вот если заменить
ADODataSet1.NextRecordset(recordsAffected);
на
adodataset1.Recordset:=ADODataSet1.NextRecordset(recordsAffected);
то действительно выскакивает 3 и 0.
То есть выходит, что вызов метода NextRecordset реально старый рекордсет не чистит? Или где я ошибаюсь?
sniknik (2004-11-08 12:57:00) [4]а если не селект, если инсерт? RecordsAffected вернет количество записей над которыми совершениа операция но рекордсет будет пустой, вот тебе и <>.
> А то при ADODataSet1.commandtext равном 'select * from t1 select * from t2'
> после строчки ADODataSet1.NextRecordset(i) у меня всегда i=-1.
возможно это непровильно работает (что именно ADODataSet оставляет (?), возможно именно второй рекордсет)
я в таких случаях пользуюсь, примерно таким
ADOCommand1.CommandText:= 'select * from t1 select * from t2';
ADODataSet1.Recordset:= ADOCommand1.Execute(RecordsAffected, EmptyParam);
ADODataSet1.NextRecordset(RecordsAffected);
(на самом деле с промежуточным переменной рекордсет, но и так должно сработать, а так попроще)
> Как понимать слова Clears the current Recordset object?
прямо, старый рекордсет очишается когда на его место следующий приходит, нигде не сохраняется (одна из причин пользоваться промежуточным).