ADO - pusty RecordSet vs dane w Management Studio (MS SQL)

0

Witam Państwa, pisze z prośbą o wytłumaczenie pewnego zjawiska. Mam specjalnie spreparowane zapytanie które powinno generować błąd (wpisanie null'a do pola int not null):

begin transaction; 
  begin try 
    update tabela set pole=null where id=1; 
  end try 
  begin catch 
    select ERROR_NUMBER() AS ErrorNumber,ERROR_SEVERITY() AS ErrorSeverity,ERROR_STATE() AS ErrorState,ERROR_PROCEDURE() AS ErrorProcedure,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage; 
    if @@TRANCOUNT>0 rollback transaction; 
  end catch;
  if @@TRANCOUNT>0 commit transaction; 

Kiedy wywołam to w ManagementStudio wszystko jest ok dostaje tabelkę z info o błędzie, natomiast jeśli wywołam to z poziomu Delphi (ADO) w następujący sposób:

var
  rs:_recordset;
  str: string;
begin
  str := '...tu wpisuje to zapytanie...';
  rs :=  dm.conRZO.Execute(str, cmdText, []);
  showmessage(inttostr(rs.RecordCount));

Dostaje komunikat "Operacja nie jest dopuszczalna, gdy obiekt jest zamknięty" natomiast wykonanie najzwyklejszego selecta (select * from tabela) zwraca wypełnionego RecordSet'a.

0

Sprawdź, co się wykona, gdy:

var
  rs:_recordset;
  str: string;
begin
  str := 'UPDATE tabela SET pole=NULL WHERE id=1';
  rs :=  dm.conRZO.Execute(str, cmdText, []);
  showmessage(inttostr(rs.RecordCount)); 
0

Jak należało się spodziewać:

Cannot insert the value NULL into column 'pole', table 'TESTY.dbo.tabela'; column does not allow nulls. UPDATE fails

Pierwotne zapytanie z transakcją właściwie obsługuje wyjątek (try/catch) po prostu nie zwraca treści selecta wykonanego w CATCH.

Poszedłem kawałek dalej i wykasowałem polecenia związane z transakcją. Niestety efekt nadal ten sam, co raczej wyklucza problemy z obsługą transakcji.

0

conRZO to connection czy query?

0

ADOConnection

Wybaczcie post pod postem nie mogę edytować tamtego.

Query też nic nie zwraca. Wywala się komunikatem o pustym DataSet'cie. Gdy ustawie opcje eoExecuteNoRecords to błędu nie mam ale danych też nie.

0

query, a tym bardziej metoda Execute połączenia się do takich zapytań nie nadaje. Do takich zapytań jest ADOCommand

0

ADOcommand ma tylko Execute. Które działa jak to Execute z ADOconnection.

0

Dopisz na początku zapytania

SET NOCOUNT ON 

No i, na wszelki wypadek, przeładuj serwer. No i nie jest prawdą, że

abrakadaber napisał(a)

query, a tym bardziej metoda Execute połączenia się do takich zapytań nie nadaje.

W ADO i mssql można to robić.

0

sadam2 jesteś wielki, w końcu zadziałało jak bym chciał :) Bardzo dziękuje!

0

E tam, kurdupel ze mnie. Niewiele większy od Kaczora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1