Strona 1 z 1

dbExpress ograniczenia problem

Nowy postNapisane: piątek, 11 lipca 2014, 12:25
przez brzoo
Używając silnika bazodanowego dbExpress i komponentu TSQLDataSet jako TSQLTable odzwierciedlajacej tablice w bazie danych mysql napotkałem pewien problem.
Tablica jest cały czas używana a w tym czasie chciałbym zadać query do bazy o właśnie tą tablice, o jakiejś jej specyficzne rekordy. Narazie nie mogę tego zrobić bo dostaje error : Cannot perform this operation on an open dataset. MOżliwe, że jest to związane z ograniczeniami dbexpress poprzez unidirectional datasets. Jak to obejść ?

Re: dbExpress ograniczenia problem

Nowy postNapisane: piątek, 11 lipca 2014, 12:44
przez Mironas
Możesz podać fragment kodu którym robisz to zapytanie?

Komunikat informuje nie że tabela w bazie danych jest otwarta tylko że otwarty jest komponet 'DataSet' którym chcesz wykonać zapytanie.

Prawdopodobnie masz otwarty komponent bazodanowy (instukcją Open()) i za pomocą tego samego komponentu próbujesz wykonać ExecSQL(). Tak się nie da.
Do wywołania zapytania najpierw zamknij ten komponent albo użyj innej kopii komponentu.

Re: dbExpress ograniczenia problem

Nowy postNapisane: poniedziałek, 14 lipca 2014, 11:58
przez brzoo
Poczytałem sobie o open() i close() na DataSet i faktycznie to było problemem.
Mam nadzieję, że nie jestem irytujący, ale mam jeszcze jedno pytanie :/
Chcę sobie sortować dane w TDBGrid. Więc gdzieś w kodzie, gdy dataSet jest zamknięty ustawiam property na takie wybrane przez uzytkownika do sortowania poprzez SortFieldNames w TsqlDataSet.
Pozniej jest button sort, i gdy sie go nacisnie zasadniczo odswieza sie tabela. Tak jest w kodzie :

KOD cpp:     UKRYJ  
if (this->SQLDataSet1->Active == false)
        {
                this->SQLDataSet1->Open();
                this->SQLDataSet1->Refresh();
                this->SQLDataSet1->Close();
        }      
        else
        {
                this->SQLDataSet1->Refresh();
        }
nie mniej jednak nnie obserwuje aby rekordy w TDBGrid zmienialy swoja kolejnosc. To dziwne bo gdy rekordy są dodawane to dynamicznie się dodaję ale zachowując order by z property ustwianego nie w czasie run-time.

Re: dbExpress ograniczenia problem

Nowy postNapisane: poniedziałek, 14 lipca 2014, 13:34
przez Mironas
Ponieważ TSQLDataSet1 nie da się bezpośrednio przez TDataSource podłączyć do TDBGrid-a to przypuszczam, że po drodze masz jeszcze inne komponenty pośredniczące (np TClientDataSet) i to przez to masz problem.

Sortowanie najlepiej robić w zapytaniu SQL (order by) a nie w SortFieldNames.

Zamiast TSQLDataSet1 ja użył bym TSimpleDataSet. Połączenie wyglądało by wtedy tak:
TSQLConnection -> TSimpleDataSet -> TDataSource -> TDBGrid

PS
Nie musisz pisać 'this->...'
wystarczy samo SQLDataSet1->Open();

Re: dbExpress ograniczenia problem

Nowy postNapisane: wtorek, 15 lipca 2014, 07:52
przez brzoo
Dziękuje, właśnie wystarczyło ClientDataSet ustawić property IndexFieldNames na wlasciwe. . Wiem ze to malo ladne rozwiazanie :/. Moze pozniej przemigruje na TSimpleDataSet.
Tu o tym więcej :
http://edn.embarcadero.com/article/29056
swoją drogą, używam this-> wszędzie dla czytelności