2012-03-29 15 views
17

Ich entwickle normalerweise mit einem Live-Server, aber zum ersten Mal dachte ich, ich würde den Sprung machen und sehen, ob ich alle meine (C++) MySQL-Code als eingebetteten Server arbeiten könnte. Besonders gern bereite ich mich auf vorbereitete Aussagen, da sie (IMHO) der nicht vorbereiteten Sorte "generell" überlegen sind.Sind vorbereitete Anweisungen in eingebetteten MySQL unterstützt

Ich habe versucht mit libmysqld von 5.5.22 und libmysqld von 5.6.4 und keiner funktioniert.

Verbindung wird hergestellt, einfache mysql_query/mysql_real_query Befehle funktionieren gut, aber sobald meine erste vorbereitete Anweisung einen mysql_stmt_fetch() ausgibt, bekomme ich die gehassten "Befehle nicht synchron" -Fehler.

Ein sehr ähnliches Problem apparte auf Orakelforen (http://forums.mysql.com/read.php?168,507863,507863#msg-507863) ohne Entschließung.

Ich sehe nicht, noch glaube ich, dass ich irgendwelche Befehle zwischen mysql_real_connect() und der mysql_stmt_fetch() fehlt.

Alle meine Suchen sind leer für jedes Beispiel eines eingebetteten Servers, der vorbereitete Anweisungen verwendet. Ich habe auch keinen wirklichen Satz gefunden, "das kannst du nicht tun".

Also ... ist es oder wird es nicht unterstützt?

Vielen Dank für Ihr Fachwissen.

// bearbeiten , um diese weiter zu entmystifizieren (und anweisen, falls erforderlich) meine volle mysql cmd-Sequenz ist wie folgt:

mysql_library_init(); // as embedded 
mysql_init(); 
mysql_options(MYSQL_SET_CHARSET_NAME); //to utf8 
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION); 
mysql_real_connect(); 
mysql_real_query("SET NAMES 'utf8'"); 
mysql_real_query("SET CHARACTER SET 'utf8'"); 
mysql_set_character_set("utf8"); // yes, you really do need to set utf8 four times 
mysql_autocommit(mAutocommit); 

an dieser Stelle, mysql_real_query() Anrufe arbeiten. Ich fahre fort ...

//all this would only happen once for each stmt 
{ 
    mysql_stmt_init(); 
    mysql_stmt_prepare(theQuery); 
    mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery 
    mysql_stmt_result_metadata() 
    mysql_num_fields(); // to assert the output bind object has the same number of params as theQuery 
    mysql_free_result(metadata); 
    mysql_stmt_bind_param(); // called IF there are input params 
    mysql_stmt_bind_result(); // pretty much always called for the output params 
} 
// and at last 
mysql_stmt_execute(); 
//mysql_stmt_store_result(); //{OPTIONAL: use if you want to buffer the fetch - I dont} 
mysql_stmt_fetch(); // ERROR! commands out of sync. 

// and for completeness, 
mysql_stmt_free_result(); 
mysql_stmt_close(); 

// and the shutdown 
mysql_close(); 
mysql_library_end(); 

Antwort

3

Ich hatte Angst davor .. aber nach nicht wenig Arbeit, habe ich eine Antwort auf meine Frage und eine Lösung für das Problem. (Ja, ich bin ein fauler Programmierer ... ich hatte gehofft, jemand anderes hätte mir gesagt, dass das alles notwendig war..hehe)

Hier ist meine eigene autoritative Antwort auf Embedded Server + vorbereitete Anweisungen nicht funktionierende Frage.

die frage: sind stmts in embedded unterstützt? die Antwort ... sie sollten sein, aber sie sind NICHT.

Ja, es gibt einen Fehler in eingebetteten MySQL in Bezug auf Stmts. Siehe: http://bugs.mysql.com/bug.php?id=62136

Herr Qi Zhou hat all meinen Respekt. Er stellte irgendwie fest, dass mysql_stmt_execute() bei der Ausführung von embedded den Ergebnisstatus fälschlicherweise auf "MYSQL_STATUS_GET_RESULT" anstatt auf "MYSQL_STATUS_STATEMENT_GET_RESULT" einstellte (dh ein STMT wie ein Nicht-Statement behandelte). Dies würde natürlich zu einem "nicht synchronisierten Befehl" führen. Error. Daher muss der Quellcode selbst gepatcht werden.

Wie das zu tun .. Die MySql "wie auf Windows bauen" an: http://dev.mysql.com/doc/refman/5.5/en/source-installation.html

Referenzen dies viel einfacher zu lesen, HOW-TO-BUILD: http://www.chriscalender.com/?p=689

Zusätzliche HOW-TO Hinweise, die ich in dem Prozess

bestimmt Chris Chris ist wie für VS2008 Express. Ich benutze 2010 Pro und habe gelernt, dass der cmake -G arg weggelassen werden kann. Für mich war 2010 automatisch der zu verwendende Compiler.

Ich habe nur Cmake und Bison installiert. perl und bazaar sind hierfür nicht erforderlich. und ich bekam die Standard 5.5.22 Quelldistribution anstatt vom Basar zu ziehen.

re: Installation von Bison:

  • stellen Sie sicher, Bison auf einen Pfad ohne Leerzeichen NICHT
  • installieren können Installer etwas zum Startmenü hinzufügen (verursacht die „m4.exe nicht gefunden“ Fehler)
  • manuell Bisons Binärordner zum Systempfad hinzufügen

re: signtool.exe

sicherstellen, dass der Pfad zu signtool zu PATH hinzugefügt wird. Beispiel (für mich)

  • c: \ Programme \ Microsoft SDKs \ Windows \ V7.0A \ bin

Laden Sie die Quelle-Distribution von MySQL (http://dev.mysql.com/downloads/mysql/#downloads): Generisches Linux (Architektur Independent) , komprimiertes tar-Archiv (mysql-5.5.22.tar.gz)

Sie bearbeiten müssen {D: \ your_path} \ mysql-5.5.22 \ libmysqld \ lib_sql.cc

On line 340 werden Sie siehe:

if (res) 
{ 
    NET *net= &stmt->mysql->net; 
    set_stmt_errmsg(stmt, net); 
    DBUG_RETURN(1); 
} 
//ADD CODE HERE 
DBUG_RETURN(0); 

Insert zwischen dem if Codeblock und DBUG_RETURN (0) folgendes:

//kgk 2012/04/11 - see http://bugs.mysql.com/bug.php?id=62136 
// Qi Zhou's modification to allow prep'd stmts to work 
else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT) 
{ 
    stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT; 
} 

Und bauen sich eine neue Release-Version von libmysqld.dll, libmysqld.lib, libmysqld.pdb

und Das Problem ist behoben.

Wenn Sie die DLL erstellt haben, nicht wie ich und vergessen Sie, die neue DLL in den Runtime-Ordner Ihrer Binärdatei zu verschieben und sitzen dort fragen, warum die Änderung nichts getan hat. Seufzer.

FYI: Orakels Technikfreaks Fehler Bericht Kommentar markiert mit [20 Feb 18:34] Sveta Smirnova ist komplett Nonsense. Die serverARgs haben nichts mit irgendetwas zu tun.

-2

Embedded MySQL diejenige ist, die normalerweise nicht für dieses Problem verwenden und ich habe die Bahn viele Male gesucht und ich habe ein eigenes Projekt vorbereitet. Währenddessen habe ich viele Dinge gelernt, und eines davon ist, dass zuerst die Abfrage ausgeführt und dann die Ergebnisse gespeichert werden.

Um verschiedene Arten von Abfragen loszuwerden, erstellen Sie bitte ein Objekt zur Ausführung und geben das Ergebnis zurück, und in diesem Fall müssen Sie die Ausführungsabfrage nicht immer wieder schreiben.

Im vorliegenden Fall hat auch der Benutzer die Abfrage nicht ausgeführt und versucht, die Ergebnisse zu speichern, und dies geschieht nur, wenn Sie versuchen, andere Befehle zu kopieren. So ist die Lösung für das Problem ist mysql_stmt_execute auszuführen und dann mysql_stmt_store_result

+1

Vielen Dank für Ihre Hilfe. Meine Frage betrifft nicht den Wert vorbereiteter Anweisungen, sondern Informationen darüber, ob sie mit der eingebetteten mysql-Bibliothek arbeiten (dh kein externer Server). Für mich arbeiten sie NICHT. Zweitens ist der Aufruf von mysql_stmt_store_result nicht relevant. Für Ihre Referenz siehe: http://dev.mysql.com/doc/refman/5.5/en/mysql-stmt-store-result.html Wenn Sie nicht puffern die Fetch (was ich nicht bin), dann tun Sie nicht muss Laden anrufen (was ich nicht). Nichtsdestoweniger, nur um zu sehen, habe ich Ihren Vorschlag ausprobiert und die Un-Synchronisierung tritt bei dem Store-Befehl auf. –

-1

http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html

sorry für mein schlechtes Englisch zu nennen, aber Problem ist, dass mysql_stmt_fetch offen Cursor, aber mysql_stmt_execute nur mysql_stmt_store_result Arbeit mit Cursor ausführen ...

+0

Mein Code-Pfad ist wie oben, mysql_stmt_execute() gefolgt von mysql_stmt_fetch(). Dies ist perfekt implementiert "STMT" -Code beim Herstellen einer Verbindung zu einem Remote-MySQL-Server. Es erzeugt jedoch einen "nicht synchronisierten" Fehler, wenn es auf einen eingebetteten Server angewendet wird. Also ... deine Antwort ist nicht relevant. –

Verwandte Themen