dbExpress ograniczenia problem

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

dbExpress ograniczenia problem

Nowy postprzez brzoo » piątek, 11 lipca 2014, 12:25

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ść ?
Avatar użytkownika
brzoo
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): środa, 9 lipca 2014, 09:02
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: rad studio XE6
Gadu Gadu: 0
    Windows 7Firefox

Re: dbExpress ograniczenia problem

Nowy postprzez Mironas » piątek, 11 lipca 2014, 12:44

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.

Za ten post autor Mironas otrzymał podziękowanie od:
brzoo
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: dbExpress ograniczenia problem

Nowy postprzez brzoo » poniedziałek, 14 lipca 2014, 11:58

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.
Avatar użytkownika
brzoo
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): środa, 9 lipca 2014, 09:02
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: rad studio XE6
Gadu Gadu: 0
    Windows 7Firefox

Re: dbExpress ograniczenia problem

Nowy postprzez Mironas » poniedziałek, 14 lipca 2014, 13:34

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();

Za ten post autor Mironas otrzymał podziękowanie od:
brzoo
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: dbExpress ograniczenia problem

Nowy postprzez brzoo » wtorek, 15 lipca 2014, 07:52

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
Avatar użytkownika
brzoo
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): środa, 9 lipca 2014, 09:02
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: rad studio XE6
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Bazy danych

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron