Práce s MySQL v jazyce C++

Pavel

Práce s MySQL v jazyce C++
« kdy: 13. 08. 2012, 13:33:58 »
Nemá někdo vzorový funkční zdroják pro práci s MySQL v C++?
« Poslední změna: 13. 08. 2012, 14:21:16 od Petr Krčmář »


DK

Re:Práce s MySQL v jazyce C++
« Odpověď #1 kdy: 13. 08. 2012, 14:29:25 »
Kód: [Vybrat]
http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html
...

Tom_as

Re:Práce s MySQL v jazyce C++
« Odpověď #2 kdy: 13. 08. 2012, 15:07:25 »
Priprav se, je to opruz nejvetsi.

Pavel

Re:Práce s MySQL v jazyce C++
« Odpověď #3 kdy: 13. 08. 2012, 15:11:09 »
No tak pod C je to teda brnkacka, ale tohle je teda mega marast...

Pavel

Re:Práce s MySQL v jazyce C++
« Odpověď #4 kdy: 13. 08. 2012, 15:55:39 »
No tak nic ...
Asi zustanu u C knihovny :o/
Tohle mi přijde zbytečně složitý


DK

Re:Práce s MySQL v jazyce C++
« Odpověď #5 kdy: 13. 08. 2012, 16:03:10 »
dyt je to uplne jednoduche objektove pouziti

johnny

Re:Práce s MySQL v jazyce C++
« Odpověď #6 kdy: 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;
}

Tom_as

Re:Práce s MySQL v jazyce C++
« Odpověď #7 kdy: 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.

johnny

Re:Práce s MySQL v jazyce C++
« Odpověď #8 kdy: 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.

Re:Práce s MySQL v jazyce C++
« Odpověď #9 kdy: 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.

Re:Práce s MySQL v jazyce C++
« Odpověď #10 kdy: 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