CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Komponent DBComboBox

Komponent DBComboBox

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.

Komponent DBComboBox

Nowy postprzez rafalskraba » sobota, 14 lipca 2012, 08:04

Witam,

Baza danych Firebird, połaczenie poprzez SimpleDataSet, zapytanie do bazy danych SQLQuery.
do komponentu DBGrid wpisuję dane z tablicy przy pomocy poniższego kodu:

KOD cpp:     UKRYJ  
        DM1->SQLQuery1->SQL->Add("SELECT USERS.USERS_NAME FROM USERS ORDER BY USERS.USERS_NAME");

        DM1->SQLQuery1->ExecSQL();

        for(DM1->SQLQuery1->Open();!DM1->SQLQuery1->Eof;DM1->SQLQuery1->Next())
        {
                DBComboBox1->Items->Add(DM1->SQLQuery1->Fields->Fields[0]->AsAnsiString);
        }
DBComboBox1->ItemIndex=4;
Dlaczego przy kliknieciu w dowolne pole formularza wartość wyświetlana w DBComboBox jest czyszczona.

W przypadku komponenty ComboBox taka sytuacja nie ma miejsca

KOD cpp:     UKRYJ  
        DM1->SQLQuery1->SQL->Add("SELECT USERS.USERS_NAME FROM USERS ORDER BY USERS.USERS_NAME");

        DM1->SQLQuery1->ExecSQL();

        for(DM1->SQLQuery1->Open();!DM1->SQLQuery1->Eof;DM1->SQLQuery1->Next())
        {
                ComboBox1->Items->Add(DM1->SQLQuery1->Fields->Fields[0]->AsAnsiString);
        }
        ComboBox1->ItemIndex=0;
Proszę o pomoc
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Komponent DBComboBox

Nowy postprzez Cyfrowy Baron » sobota, 14 lipca 2012, 10:17

Pewnie dlatego, że sterowanie DBComboBox odbywa się automatycznie przez bazę danych, gdyż to komponent bazodanowy, a zwykłe ComboBox już nie ma nic wspólnego z bazą danych.

DBComboBox musi być podłączony do bazy danych poprzez właściwości DataField i DataSource. Jeżeli konstrukcja bazy danych nie wymaga użycia DBComboBox, to używaj zwykłego ComboBox.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Komponent DBComboBox

Nowy postprzez Corvis » poniedziałek, 30 lipca 2012, 09:12

Dokładnie jak baron napisał.

Mam jeszcze jedną uwagę do tego co tu zobaczyłem. Jeżeli wczytujesz coś do TComboBox z bazy danych zawsze sobie wczytaj jeszcze ID - klucz główny. Czyli jeżeli masz tabelę USERS i w niej pola ID, USERS_NAME (Tutaj kolejna uwaga dobrą praktyką jest nie używanie znaków "_" gdyż zmniejszają czytelność kodu) zawsze zadaj sobie zapytanie: select ID, USERS_NAME from USERS i wczytaj wynik do listy w taki sposób:

KOD cpp:     UKRYJ  
sqldtsMain->Open(); // sqldtsMain - data set który wykonał zapytanie
while(!sqldtsMain->Eof) {
  lst->AddObject(sqldtsMain->Fields->Fields[1]->AsString, (TObject*)sqldtsMain->Fields->Fields[0]->AsInteger);
  sqldtsMain->Next();
}
sqldtsMain->Close();
 

Taki sposób pozwoli ci szybciej i bezpieczniej "dobierać się" do danych w tabeli. Po wybraniu pozycji w ComboBox masz od razu jej klucz główny z bazy a co za tym idzie masz pewność, że na pewno użyjesz dobrej wartości.

Odczytanie wartości klucza głównego dla wybranej pozycji z Comboboxa:
KOD cpp:     UKRYJ  
if(ComboBox1->ItemIndex >=0) {
    int Klucz = (int)ComboBox1->Items->Objects[ComboBox1->ItemIndex];
}
 
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome


  • 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 3 gości

cron