[DELPHI] Cursor not returned from Query

0

Witam

Wykonuję operacje SQL-owe komponentem SQLDataSet (wiem że istnieją inne wyrafinowane metody ale ja chce skorzystać właśnie z tej) :-|

if Form1.SQLDataSet1.Active then Form1.SQLDataSet1.close;   // jeśli SQLDataSet1 wlaczony to wylacz         // uaktualnianie DBGrida
if Form1.ClientDataSet1.Active then Form1.ClientDataSet1.Close; // jeśli ClientDataSet1 wlaczony to wylacz
Form1.SQLDataSet1.CommandText:='';                  //  wyczyść pole z zapytaniem SQL;
Form1.SQLDataSet1.CommandText:=(Memo1.Text); // wczytanie polecnia
Form1.SQLDataSet1.Open;
Form1.SQLDataSet1.Active := true;       // włącz SQLDataSet1
Form1.ClientDataSet1.Active := true;   // włącz ClientDataSet1

Niestety po wykonaniu tych procedur otrzymuje błąd

"SQLDataSet1 Cursor not returned from Query"

Co dziwne przy sortowaniu nie wyrzuca błędu tylko dopiero przy dodaniu np rekordów lub tabeli ale najdziwniejsze jest to, że pomimo błędu tabela lub rekord powstaje.

Nie wiem o co chodzi bo jestem początkujący :-|

0

Sproboj napisac to przy pomocy ADOCommand , moze nie bedzie konflikt wyskakiwal , albo cos z tym memo masz nie tak :p

0

Nic to mi nie daje a z Memo jest wszystko ok bo sortowanie poleceniami SQL-dział bez zarzutu

tylko błąd wyskakuje kiedy chcę wprowadzać zmiany w tabeli

0

Czy używasz TProvider między DataSet i ClientDataSet? Podaj też treść zapytania SQL.

0

Zrobiłem następujące połączenie

SQLConnection1 -> DataSetProvider -> ClientDataSet -> DataSource -> DBGird

Używałem kilku zapytań SQL oto dwa

dodanie tabeli

create table ADRESY
(
Nazwisko varchar(40),
Adres varchar(50),
Telefon varchar(20)
)

Dodanie rekordu

insert into ADRESY
(Nazwisko, Adres, Telefon)
values
('Piwowarczyk, Maciek','Warszawa','999999999')

Nie mam wątpliwości że są poprawne bo jak napisałem wcześniej są wykonywane

0

OPEN stosuje się tylko do zapytań typu SELECT. Dlatego dostajesz błąd, bo zapytanie nie zwraca danych (w postaci zwanej "kursorem").

0

Pomimo skasowania open przy tworzeniu nadal wyskakuje błąd :|

A ewentualnie co zrobić żeby mi nie zwracało "kursora" ?

0

A po co ci kursor jeśli nie przeglądasz danych? Pamiętaj że active:=true = open, więc to też trzeba skasować. Do zapytań sql nie zwracających danych stosuje się execute zamiast open.

0

Serdecznie dziękuję, korzystając z okazji chciałbym zapytać jeszcze jak pobrać nazwy kolumn z DBGrida za pomocą którego przeglądam bazę chce je później umieścić w Comboboxie

Nazwy tabel znajdujących się w bazie pobieram za pomocą

 Connection.GetTableNames(ComboBox1.Items,false); // wyswietl nazwy tabel w ComboBoxie

Ale nie wiem jak pobierać nazwy kolumn

0

TDataSet.GetFieldNames

0

Wielkie dzięki :-)

A jak sprecyzować o którą mi tabelę chodzi ?

Czy po prostu będzie to polecenie brało nazwy kolumn wyświetlonych w danej chwili w DBGridzie ?

0

Przecież wiesz który DataSet jest związany z Gridem więc jego używasz.

0

Dzięki :)

0

Podaje rozwiązanie mojego problemu :)

Zrealizowałem zapytania za pomocą komponentu SQLQuery

procedure TForm4.sButton3Click(Sender: TObject);
begin
if Form1.SQLDataSet1.Active then Form1.SQLDataSet1.close;   // jesli SQLDataSet1 wlaczony to wylacz         // uaktualnianie DBGrida
if Form1.ClientDataSet1.Active then Form1.ClientDataSet1.Close; // jesli ClientDataSet1 wlaczony to wylacz

Form1.SQLQuery1.Close;                       // otwurz SQLQuwery1
Form1.SQLQuery1.SQL.Clear;                   // wyczyść zaytanie SQL
Form1.SQLQuery1.SQL.Add(Form1.memo1.Text);   // pobierz tereść zapytania z Form1.memo1
Form1.SQLQuery1.ExecSQL;                     // wyonaj polecenie // zmodyfikuj bazę

Form1.SQLDataSet1.Active := true;       // wlacz SQLDataSet1    // uaktualnianie DBGrida
Form1.ClientDataSet1.Active := true;   // wlacz ClientDataSet1



end;

Wszystkim serdecznie dziękuję :)

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