Strona 1 z 1

Komponenty do połączenia z MySQL

Nowy postNapisane: wtorek, 3 listopada 2009, 13:31
przez Bert1223
Witam, proszę o pomoc chciałbym połączyć się z bazą MySQL na innym serwerze używam 'Wersja klienta MySQL: 5.0.51a'
Czytałem, że do połączenia trzeba korzystać z komponentów, pobrałem ZeosLib próbuję dodać komponent -- Componetn -> Instal Pack... wyszukuje w folderze cbuilder6 pliku o rozszerzeniu *.dpl ale niestety nie ma. Prosiłbym o pomoc w zainstalowaniu, podaniu linku bo może mam uszkodzone pliki ZeosLib

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: środa, 4 listopada 2009, 22:20
przez Bert1223
Temat można uważać za zamknięty. Zainstalowałem CodeGear C++ Builder.
dbExpress jest już dodany prosiłbym o przykłady w jaki sposób mogę dodawać, usuwać i pobierać dane z bazy danych.

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: czwartek, 5 listopada 2009, 16:30
przez banita
to chyba jakis zart. nie masz najmniejszych podstaw wiedzy odnosnie pracy w bazami danych w bibliotece VCL. musisz je najpierw zdobyc a pozniej w racie problemow zglaszac sie na forum.

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: czwartek, 5 listopada 2009, 17:51
przez Bert1223
Kilka słów w obronie co do baz danych mam pojęciem. Nie wiem w jaki sposób wydawać polecenia.
Z tego co wyczytałem, do połączenia używam TSQLConnection ustawiam wszystkie parametry i działa.
Do dodawania i usuwania rekordów używam:
Kod: Zaznacz cały
// TSQLDataSet = SQL // dla jasności

AnsiString insert= "INSERT INTO dystrybutor SET dystrybutor='";
insert += Form1->CBDys->Text;
insert += "'";

Form1->SQL->CommandText = insert;
if(Form1->SQL->ExecSQL(True) == 1)
{
   ShowMessage("Nowy dystrybutor został dodany!");
}

I wszystko działa OK. Natomiast co do SELECT, mam problem używam:
Kod: Zaznacz cały
   AnsiString odczyt;
   SQL->CommandText = "SELECT * FROM dystrybutor WHERE id='15'";
   odczyt = SQL->FieldValues["dystrybutor"];
   SQL->ExecSQL(True);

Komunikat o błędzie "Project Project1.exe raised exception class EDatabaseError with message 'SQL: Field 'dustrybutor' not found'"

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: czwartek, 5 listopada 2009, 18:05
przez banita
do pobierania danych sluzy metoda Open a nie execute

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: czwartek, 5 listopada 2009, 22:00
przez Bert1223
Kod: Zaznacz cały
SQL->CommandText = "SELECT * FROM dystrybutor WHERE id='15'";
SQL->Open();


Cały czas wyskakują błędy. Jesteś w stanie napisać kod pobierający dane z całej tabeli lub z użyciem WHERE?

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: czwartek, 5 listopada 2009, 23:15
przez banita
napisz jaka wersja IDE jakich komponentow uzywasz i napisze ci ten kod ale wtedy niczego sie nie nauczysz.

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: piątek, 6 listopada 2009, 14:49
przez Bert1223
Używam CodeGear™ C++Builder 2007, co do komponentów to dbExpress do łączenia TSQLConnection o nazwie MySQL sprawnego i działającego do zapytań typu insert i delete używam TSQLDataSet tak jak w poście powyżej, ale nie wiem jak mam pobrać np pola id, name, z tablicy user?

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: sobota, 7 listopada 2009, 00:54
przez banita
w komponencie TSQLDataSet podpinasz polaczenie z baza. W ComamndText wpisujesz zapytanie. wywolujesz metode Open() i dostajesz wynik zapytania. niestety nie mozesz tego komponentu podpiac do grida za posrednictwem datasource. do tego celu musisz wykozystac komponent TSimpleDataSet(ta sama zakladka). tam o ile pamietam odwolujesz sie tak:

TSimpleDataSet* temp = ...
temp->DataSet->CommandText = ....

metoda Open otwierasz kanal transmisyjny z baza i dostajesz rekordy z zapytania.

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: niedziela, 8 listopada 2009, 16:20
przez Bert1223
banit: Jak dla mnie zbyt mało szczegółów, żeby to odpalić.
Użyłem TSQLQuery z nazwą SQLQ podłączony do MySQL.
Kod: Zaznacz cały
SQLQ->CommandText = "SELECT spr FROM dystrybutor WHERE id='18'";
SQLQ->Open();
AnsiString odczyt = "";
odczyt = SQLQ->FieldValues["spr"];
ShowMessage(odczyt);

Odczytuje wartość 2 czyli zgadza się.

Z gwiazdką nie działa
Kod: Zaznacz cały
SQLQ->CommandText = "SELECT * FROM dystrybutor WHERE id='18'";

Nie działa
Kod: Zaznacz cały
SQLQ->CommandText = "SELECT spr, dystrybutor FROM dystrybutor WHERE id='18'";


Trochę to bez sensu do każdej kolumny z tabeli pisać osobne zapytanie.
Kolejnym problemem jest pobieranie pola typu blob czy tetx.
Co prawda zapytanie zwróciło liczbę 2, ale przy zamianie spr na dystrybutor typu text, zapytanie zwraca NULL

Banit proszę napisz trochę bardziej szczegółowo jak połączyć się przy pomocy TSQLDataSet, bo np ten typ nie ma funkcji commandtext

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: niedziela, 8 listopada 2009, 19:01
przez banita
po wykonaniu metody Open dane odbiera sie tak:

metoda next przechodzi do kolejnego rekordu. close zamyka zbior.

query->FieldByName("nazwa_kolumny")->As... <----- tutaj odpowiedni typ: AsInteger, AsString itd...

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: niedziela, 8 listopada 2009, 20:56
przez Bert1223
Próbuję cały czas z TSQLQuery pod nazwą SQLQ:

Dostaję błąd "Could no find a match for 'operator AnsiString::=(TField *)'"
Kod: Zaznacz cały
   SQLQ->CommandText = "SELECT dystrybutor FROM dystrybutor WHERE id='20'";
   SQLQ->Open();
   AnsiString odczyt = "";
   odczyt = SQLQ->FieldByName("dystrybutor");


Po zmianie kodu dostaję dostaję cały czas NULL, a nie np ABC Data tak jak w rekordzie.
Kod: Zaznacz cały
   odczyt = SQLQ->FieldByName("dystrybutor")->AsString;


W dalszej części próbowałem z: TSimpleDataSet pod nazwą SDS. W efekcie dostaję komunikat: "Project1.exe raised exception class EOleException with message "Katastrofalny błąd". Fajnie, że ten komunikat jest po polsku ale skąd mam wiedzieć czego dotyczy?"
Kod: Zaznacz cały
   SDS->DataSet->CommandText = "SELECT dystrybutor FROM dystrybutor";
   SDS->Open();
   // SDS->FieldValues["dystrybutor"];

Re: Komponenty do połączenia z MySQL

Nowy postNapisane: poniedziałek, 9 listopada 2009, 18:32
przez banita
wyciaganie danych za pomoca TSQLQuery:

Kod: Zaznacz cały
   TSQLConnection* conn = new TSQLConnection(0);
   conn->ConnectionName = "MySQLConnection";
   conn->DriverName = "MySQL";
   conn->GetDriverFunc = "getSQLDriverMYSQL";
   conn->LibraryName = "dbxmys.dll";
   conn->VendorLib = "libmysql.dll";
   conn->LoginPrompt = false;
   conn->Params->Values["User_Name"] = "xxx";
   conn->Params->Values["Database"] = "yyy";
   conn->Params->Values["Password"] = "zzz";
   conn->Params->Values["HostName"] = "127.0.0.1";

   TSQLQuery* query = new TSQLQuery(0);
   query->SQLConnection = conn;
   query->CommandText = "select * from xyz";
   query->Open();

   if(!query->IsEmpty())
   {
      for(int i(0); i < query->RecordCount; ++i)
      {
         ShowMessage(query->FieldByName("imie")->AsString + ' ' + query->FieldByName("nazwisko")->AsString);
         query->Next();
      }

      query->Close();
   }

   conn->Close();

tutaj mozesz pobrac dane ale nie mozesz ich wyswietlic za pomoca komponentu TDBGrid
aby tego dokonac musisz wykozystac komponent TSimpleDataSet:

Kod: Zaznacz cały
   TSQLConnection* conn = new TSQLConnection(0);
   conn->ConnectionName = "MySQLConnection";
   conn->DriverName = "MySQL";
   conn->GetDriverFunc = "getSQLDriverMYSQL";
   conn->LibraryName = "dbxmys.dll";
   conn->VendorLib = "libmysql.dll";
   conn->LoginPrompt = false;
   conn->Params->Values["User_Name"] = "zzz";
   conn->Params->Values["Database"] = "yyy";
   conn->Params->Values["Password"] = "zzz";
   conn->Params->Values["HostName"] = "127.0.0.1";

   TSimpleDataSet* data_set = new TSimpleDataSet(0);
   data_set->Connection = conn;
   data_set->DataSet->CommandType = ctQuery;
   data_set->DataSet->CommandText = "select * from xyz";
   data_set->Open();

   TDataSource* data_source = new TDataSource(0);

   if(!data_set->IsEmpty())
   {
      data_source->DataSet = data_set;
      GRID->DataSource = data_source;
   }


przyklad pod c++builder 2010, w wersji 2007 moze byc inna nazwa biblioteki dbexpress:
conn->LibraryName = "dbxmys.dll";


przyklad nie uwzglednia obslugi bledow!!!
musisz dołaczyc odpowiednie naglowki albo skozystac z wizualnych komponentow.