Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Pavel 13. 08. 2012, 13:33:58

Název: Práce s MySQL v jazyce C++
Přispěvatel: Pavel 13. 08. 2012, 13:33:58
Nemá někdo vzorový funkční zdroják pro práci s MySQL v C++?
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: DK 13. 08. 2012, 14:29:25
Kód: [Vybrat]
http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html
...
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Tom_as 13. 08. 2012, 15:07:25
Priprav se, je to opruz nejvetsi.
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Pavel 13. 08. 2012, 15:11:09
No tak pod C je to teda brnkacka, ale tohle je teda mega marast...
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Pavel 13. 08. 2012, 15:55:39
No tak nic ...
Asi zustanu u C knihovny :o/
Tohle mi přijde zbytečně složitý
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: DK 13. 08. 2012, 16:03:10
dyt je to uplne jednoduche objektove pouziti
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: johnny 13. 08. 2012, 20:24:05
http://tangentsoft.net/mysql++/
Kód: [Vybrat]
#include <mysql++/mysql++.h>
...
mysqlpp::MultiStatementsOption* dboption = new mysqlpp::MultiStatementsOption(true);
dbconn.set_option(dboption);
cout<<"I: connecting to database server ..."<<endl;
if (dbconn.connect("meno databazy", "ip adresa alebo hostname", "username", "password"))
{
   cout<<"Mysql connect OK"<<endl;
}
else
{
   cerr<<"FAtal error: "<<dbconn.error()<<endl;
   exit(1);
}
....
/funkcia co vrati NULL alebo priezvisko ktoré prislúcha menu
char* funkcia_simple_select(mysqlpp::Connection &dbconn, const char* meno)
{
   char* ret = NULL;
   
   if(mysqlpp::Query query = dbconn.query())
   {
      query << "SELECT priezvisko FROM tabulka WHERE meno=" << mysqlpp::quote << meno;
      if (mysqlpp::StoreQueryResult res = query.store())
      {
         if(!res.empty())
         {
            ret = new char [strlen(res[0][0])+1];
            strcpy(ret,res[0][0]);
         }
      }
      else cout<<"QUERY: "<<query.error()<<endl;
   }
   else cout<<"CONNECTION: "<<dbconn.error()<<endl;
   
   return ret;
}

//funkcia na pridavanie
bool funkcia_simple_insert(mysqlpp::Connection &dbconn, const char* meno,const char* priezvisko)
{
   bool ret=0;
   
   if(mysqlpp::Query query = dbconn.query())
   {
      query << "INSERT INTO tabulka (meno,priezvisko) VALUES(" << mysqlpp::quote << meno << "," << mysqlpp::quote << priezvisko  << ")";
      if(query.exec())
      {
         ret=1;
      }
      else cout<<"query error: "<<query.error()<<endl;
   }
   return ret;
}
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Tom_as 14. 08. 2012, 08:24:41
DK > použití je opravdu jednoduche ale zprovoznění je pěkne na..... Viz: One problem that can occur is when the tools you use to build your application are not compatible with the tools used to build the binary versions of MySQL Connector/C++. Ideally, you need to build your application with the same tools that were used to build the MySQL Connector/C++ binaries.

Bojoval jsem s tím několik hodin a stačilo mě. Mysql++ zase špatně komunikoval s balíkem Boost a nepodařilo se kompilovat. Pokud je to pro tebe jednoduché prosím napiš sem stručný návod.
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: johnny 14. 08. 2012, 22:41:34
Ja som zatiaľ žiadny problém nemal. Všetko šľapalo vždy ako malo. Všetko som inštaloval z debian repozitárov. Problém môže nastať, keď mysql knižnice linkuješ dynamicky a prejdeš na iný systém, vtedy by sa zišlo dodávať k binárke aj mysql knižnice.
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Ondřej Novák 14. 08. 2012, 23:29:18
Lze si vystačit s C knihovnou a napsat si jednoduchý wrapper. Ta C knihovna je podobná jako v PHP.
Název: Re:Práce s MySQL v jazyce C++
Přispěvatel: Ondřej Novák 14. 08. 2012, 23:38:38
Lze si vystačit s C knihovnou a napsat si jednoduchý wrapper. Ta C knihovna je podobná jako v PHP.

PS: Abych namlsal, mám wrapper, se kterým se pracuje takto:
Kód: [Vybrat]
while(sqlconn.start()) try {
MySQL::Result res = sqlconn("SELECT * FROM %1 WHERE `id`=%2")
.field(tableName).arg(curId).exec();

while (res.hasItems()) {
MySQL::Row r = res.getNext();
int cols = res.countFields();
for (int i = 0; i < cols; i++) if (! r[i].isNull() ){
String key = res.getFieldName(i);
String val = r[i];
                           //... zkraceno ...
}
}
} catch (const MySQL::ServerError_t &e) {
sqlconn.except(e,THISLOCATION);
}
sqlconn.commit();

Řeší i deadlock v transakci (proto ten while). Ale zatím není open source (možná někdy bude). Takže jen pro inspiraci