CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Automatyczne uaktualnianie bazy danych

Automatyczne uaktualnianie bazy danych

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.

Automatyczne uaktualnianie bazy danych

Nowy postprzez rafalskraba » niedziela, 5 września 2010, 22:43

Mam utworzoną bazę danych w firebirdzie. Rekordy do bazy danych dodaję przy pomocy następującej składni:
KOD cpp:     UKRYJ  
Form1->BikeDataSet1->Open();
                Form1->BikeDataSet1->Append();
                Form1->BikeDataSet1->DataSet->CommandText="INSERT INTO dystans(DATA,DYSTANS,PREDKOSC,OPIS) VALUES(:DATA1,:DYSTANS1,:PREDKOSC1,:OPIS1)";
                Form1->BikeDataSet1->DataSet->ParamByName("DATA1")->Value=DateTimePicker1->Date;
                Form1->BikeDataSet1->DataSet->ParamByName("DYSTANS1")->Value=StrToFloat(Edit2->Text);
                Form1->BikeDataSet1->DataSet->ParamByName("PREDKOSC1")->Value=StrToFloat(Edit3->Text);
                Form1->BikeDataSet1->DataSet->ParamByName("OPIS1")->Value=Memo1->Lines->Text;
                Form1->BikeDataSet1->Execute();
                Form1->BikeDataSet1->Cancel();
                Form6->Close();


Dane z tabeli bazodanowej są wyświetlane w komponencie DBGrid. Po wprowadzeniu rekordu do bazy danych nie jest on automatycznie wyświetlany przy pomocy DBGrid. Po rozłączeniu i ponownym połączeniu z bazą danych rekord się pojawia.
Jak zrobić aby po dodaniu rekordu do bazy danych był on automatycznie wyświetlany, proszę o jakieś wskazówki.

Pozdrawiam

Rafał
"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: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » niedziela, 5 września 2010, 22:49

Nie wiem, jak masz komponenty połączone tzn. DbGrid -> DataSource -> ??? ( co tutaj jest ??? )

Jeżeli TClientDataSet wystarczy dać
Kod: Zaznacz cały
ClientDatSet1->Refresh()


W sumie to też nie ma znaczenia. Wystarczy odświeżyć :) albo zamknąć i otworzyć ponownie DataSeta.
"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 VistaOpera

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez banita » niedziela, 5 września 2010, 22:51

musisz albo wprowadzic dane z poziomu dbgrid albo dac close/open datasetu.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » niedziela, 5 września 2010, 22:56

Jak już pokazałeś kodu trochę, to muszę się przyczepić :P :P

Nie używaj pełnych zapytań SQL w kodzie programu - zmień to na wywołanie odpowiednich procedur składowanych. Pomoże ci to w późniejszym wprowadzaniu zmian. Co będzie jak dojdzie ci jakieś pole w tabeli ( rzadka sytuacja chyba, że baza została źle zaprojektowana ), albo będziesz chcial zoptymalizować zapytanie, albo zminieć sortowanie danych po SELECT*, itp itd ?? Odrazu musisz kompilować program od nowa.
"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 VistaOpera

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez rafalskraba » poniedziałek, 6 września 2010, 08:18

Po wprowadzeniu funkcji uaktualniającej BikeDataSet1
Kod: Zaznacz cały
BIkeDataSet1->Refresch();

otrzymuję komunikat:
InternalDataSet: Cursor not returned from Query.
"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 XPFirefox

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » poniedziałek, 6 września 2010, 08:36

Edit:

No tak wczoraj było już późno i sie zagapiłem w tym co napisałeś.

BIkeDataSet1 używasz do dodawania danych i potem go odświeżasz, czyli odświeżasz po insert a insert nie zwaraca cursora co powoduje błąd.

Zrób takie zestawienie komponentów:

TSqlConnection -> SqlDataSet -> DataSetProvider -> ClientDatSet -> DataSource -> DbGrid - dla instrukcji select która wyświetla ci Dane z Bike.

czyli:

SqlDataSet->CommandText = " select * from ...........";
ClientDataSet->Open();

oraz

TSqlConnection -> SqlDataSet2 - SqlDatSet2 będzie służył ci do edycji danych.

i teraz tak:

Wykonujesz

SqlDatSet2->CommandText = " Insert into ..... ";
SqlDatSet2->ExecSql();

i odświeżasz dane

ClientDataSet->Refresh(); ( Refresha nie możesz zrobić na zamkniętym ClientDatSecie)
"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 VistaSafari

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez rafalskraba » poniedziałek, 6 września 2010, 23:12

Dziękuję za cenne wskazówki.
Pierwsza cześć oprogramowania działa poprawnie. Mam natomiast problem z drugą częścią tzn. SQLDataSet2.

Podłączyłem SQLConnection1 z SQLDataSet2, ale nie mogę dodać żadnego rekordu do bazy. Otrzymuję komunikat nierozpoznana tabela albo procedura.
Czy również mam podpiać moją tabelę pod SQLDataSet2?
"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: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » poniedziałek, 6 września 2010, 23:18

pod SqlDataSet2 podpinasz tylko i wyłącznie SqlConnection i dajesz zapytanie SQL do CommandText.

Wklej mi kod ktorym dodajesz rekord do bazy.
"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 VistaOpera

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez rafalskraba » poniedziałek, 6 września 2010, 23:36

Ok tak też zrobiłem
Oto kod którym dodaje rekordy do bazy danych:

Kod: Zaznacz cały
                Form1->SQLDataSet2->CommandText="INSERT INTO dystans(DATA,DYSTANS,PREDKOSC,OPIS) VALUES(:DATA1,:DYSTANS1,:PREDKOSC1,:OPIS1)";
      Form1->SQLDataSet2->ParamByName("DATA1")->Value=DateTimePicker1->Date;
      Form1->SQLDataSet2->ParamByName("DYSTANS1")->Value=StrToFloat(Edit2->Text);
      Form1->SQLDataSet2->ParamByName("PREDKOSC1")->Value=StrToFloat(Edit3->Text);
      Form1->SQLDataSet2->ParamByName("OPIS1")->Value=Memo1->Lines->Text;
      Form1->SQLDataSet2->ExecSQL();
"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: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » wtorek, 7 września 2010, 08:51

Wiesz co nigdy tak nie robiłem jak ty. W sumie zaraz sprawdzę czy tak się da.

Ja zawsze robiłem tak:

1. Sposób

SqlDataSet-> CommandText = " Insert into dystans(data,dystans,predkosc,opis) values(" + Value=DateTimePicker1->Date + "," + Edit2->Text + "," + Edit3->Text "," + Memo1->Lines->Text ");";
SqlDataSet->ExecSql();

2. Sposób lepszy !!!!!!!!

Tworzysz na serwerze bazy danych precedure składowaną np. Przykładowa z głowy: ( dla MySql)

Kod: Zaznacz cały
DELIMITER $$

CREATE PROCEDURE DodajWiersz (p1 varchar(30), p2 float, p3 float, p4 varchar(300))
BEGIN
    insert into tabela values(p1,p2,p3);
END$$


i w kodzie programu wywołujesz ją za pomocą SqlDataSeta , albo SQLStoredProc

DataSet:

Kod: Zaznacz cały
SqlDatSet->CommandText = "Call DodajWier("p1",1,1,"p4");
SqlDatSet->ExecSql() ; // bo procedura nie zwraca kursora


SQLStoredProc:

Kod: Zaznacz cały
SQLStoredProc1->Params->ParamByName("p1")->AsString = "p1";
SQLStoredProc1->Params->ParamByName("p2")->AsFloat = 1;
SQLStoredProc1->Params->ParamByName("p3")->AsFloat = 0;
SQLStoredProc1->Params->ParamByName("p4")->AsString = "p4";
SQLStoredProc1->ExecProc(); 



Pisze skrótem i pseudo kodem troche ale powinieneś zrozumieć :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House

Za ten post autor Corvis otrzymał podziękowanie od:
rafalskraba
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 VistaSafari

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » wtorek, 7 września 2010, 08:56

Twoim sposobem:


Kod: Zaznacz cały
    SQLDataSet2->CommandText = "insert into new_table values(:param);";
    SQLDataSet2->ParamByName("param")->AsInteger = 998;
    SQLDataSet2->ExecSQL();



Działa.
"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 VistaSafari

Re: Automatyczne uaktualnianie bazy danych

Nowy postprzez rafalskraba » czwartek, 9 września 2010, 22:53

Wszystko działa poprawnie.
Do wyświetlenia powiedzmy on-line rekordów przy pomocy DBGrid wprowadzonych do bazy danych niezbędne było zamkniecie i otwarcie
ClientDataSet.

Nie wiem czy w przypadku dużej ilości danych nie będzie baza się strasznie slimaczyła.

Dzięki kolego Corvis za cenne wskazówki.

P.S.
Jak już pokazałeś kodu trochę, to muszę się przyczepić :P :P

Nie używaj pełnych zapytań SQL w kodzie programu - zmień to na wywołanie odpowiednich procedur składowanych. Pomoże ci to w późniejszym wprowadzaniu zmian. Co będzie jak dojdzie ci jakieś pole w tabeli ( rzadka sytuacja chyba, że baza została źle zaprojektowana ), albo będziesz chcial zoptymalizować zapytanie, albo zminieć sortowanie danych po SELECT*, itp itd ?? Odrazu musisz kompilować program od nowa.


Czy mógłbyś przedstawić przykładową procedurę składową. Będzie bardzo wdzięczny za informacje.
"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: Automatyczne uaktualnianie bazy danych

Nowy postprzez Corvis » piątek, 10 września 2010, 00:12

niezbędne było zamkniecie i otwarcie ClientDataSet.


Jak juz cos to lepiej rób
KOD cpp:     UKRYJ  
ClientDataSet->Refresh();

Chyba, że ClientDataSet jest zamknięty wtedy używaj Open().

EDIT: Procedura Składowana dodająca użytkownica do tabeli uzytkownicy

KOD mysql:     UKRYJ  
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `DodajUzytkownika`(nazwa VARCHAR(30), aktywny SMALLINT, blokada SMALLINT)
BEGIN
    INSERT INTO uzytkownicy(nazwaUzytkownika, aktywny, blokada)
        VALUES
            (
                nazwa,
                aktywny,
                blokada
            );
END
 
"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 VistaOpera


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

cron