@MySQLCreatePreparedStatement
Syntax
@MySQLCreatePreparedStatement(MySQLHandle;QueryStr;DataTypes;MaxLengths);
Beschreibung
Erzeugt eine PreparedStatement Anfrage.
Eine solche Anfrage stellt eine Art Template dar, das anschließend mit Daten zu einer vollständigen Anfrage ergänzt und ausgeführt werden kann.
Diese Funktion ist für die mehrfache Ausführung gleichartiger Anfragen gedacht.
Z.B. um Daten in eine MySQL-DB zu schreiben.
TEXT QueryStr enthält die Anfrage bzw. das Anfrage-Template.
Beispiel:"INSERT INTO obs.access (ID,Name,Access,CrtUserWithProfs) VALUES (?,?,?,?)"
FN DataTypes enthält korrespondierend zur der in der Anfrage angegebenen VALUES-Liste die DatenTypen der Parameter.
Mögliche Typen:
Wert Art
000 MYSQL_TYPE_DECIMAL
001 MYSQL_TYPE_TINY
002 MYSQL_TYPE_SHORT
003 MYSQL_TYPE_LONG
004 MYSQL_TYPE_FLOAT
005 MYSQL_TYPE_DOUBLE
006 MYSQL_TYPE_NULL
007 MYSQL_TYPE_TIMESTAMP
008 MYSQL_TYPE_LONGLONG
009 MYSQL_TYPE_INT24
010 MYSQL_TYPE_DATE
011 MYSQL_TYPE_TIME
012 MYSQL_TYPE_DATETIME
013 MYSQL_TYPE_YEAR
014 MYSQL_TYPE_NEWDATE
247 MYSQL_TYPE_ENUM
248 MYSQL_TYPE_SET
249 MYSQL_TYPE_TINY_BLOB
250 MYSQL_TYPE_MEDIUM_BLOB
251 MYSQL_TYPE_LONG_BLOB
252 MYSQL_TYPE_BLOB
253 MYSQL_TYPE_VAR_STRING
254 MYSQL_TYPE_STRING
255 MYSQL_TYPE_GEOMETRY.
FN MaxLengths gibt die maximalen Feld-Größen korrespondierend zur der in der Anfrage angegebenen VALUES-Liste die DatenTypen der Parameter an.
Return:
Im Erfolgsfall einen erzeugten VSPECMYSQLPREPSTAT sonst @Error;
Beispiel: @MySQLCreatePreparedStatement(MySQLHandle;QueryStr;DataTypes;MaxLengths);
/* Beispiel: Einfache Übertragung von Notes-Dokumenten in eine MySQL-Tabelle.
Dieses Script führt keinen Abgleich und keine Synchronisation durch.
Die Zieltabelle wird zuerst geleert, danach werden alle passenden Notes-Dokumente neu eingefügt.
Die von MySQL erzeugte ID wird zurück in das jeweilige Notes-Dokument geschrieben. */
SrcDBPath:="test\testdb1.nsf";
SrcDBh:=@OpenDB(SrcDBPath);
/* Wenn die Notes-Datenbank nicht geöffnet werden konnte, Fehler protokollieren. */
IF(@IsError(SrcDBh)){
@LogReport(SrcDBh;3);
}ELSE{
/* MySQL-Handle initialisieren. */
MySQLh:=@MySQLInit;
/* Wenn die MySQL-Initialisierung fehlschlägt, Fehler protokollieren. */
IF(@IsError(MySQLh)){
@LogReport(MySQLh;3);
}ELSE{
/* MySQL-Optionen setzen bzw. initialisieren. */
@MySQLOptions(MySQLh);
/* Verbindungsdaten für den MySQL-Server festlegen. */
MySQLUser:="MySQLConnector";
MySQLPassword:="ConnectorPassword";
MySQLDefaultDatabase:="testdb";
MySQLHost:="172.16.1.215";
/* Verbindung zur MySQL-Datenbank herstellen. */
Ret:=@MySQLConnect(MySQLh;MySQLHost;MySQLUser;MySQLPassword;MySQLDefaultDatabase);
/* Wenn die Verbindung fehlschlägt, Fehler protokollieren. */
IF(@IsError(Ret)){
@LogReport(Ret;3);
}ELSE{
/* Ziel-Tabelle vor der Übertragung leeren.
Es findet kein Abgleich statt; die Daten werden vollständig neu übertragen. */
QueryStr:="TRUNCATE testdb.amount;";
Ret:=@MySQLQuery(MySQLh;QueryStr);
IF(@IsError(Ret)){
/* Wenn die Tabelle nicht geleert werden kann, wird der Import nicht fortgesetzt. */
@LogReport(Ret;3);
}ELSE{
/* Prepared Statement für das Einfügen der Notes-Daten in MySQL vorbereiten.
ModTime wird direkt in MySQL über NOW() gesetzt. */
QueryStr:="INSERT INTO testdb.amount (Name,Amount,UID,ModTime) VALUES (?,?,?,NOW());";
/* Datentypen und Feldlängen für die Parameter des Prepared Statements festlegen. */
QueryDataTypes:=253:4:253;
QueryLengths:=30:0:32;
/* Prepared Statement erzeugen. */
MySql_PrepStat:=@MySQLCreatePreparedStatement(MySQLh;QueryStr;QueryDataTypes;QueryLengths);
/* Wenn das Prepared Statement nicht erzeugt werden konnte, Fehler protokollieren. */
IF(@IsError(MySql_PrepStat)){
@LogReport(MySql_PrepStat;3);
}ELSE{
/* Notes-Dokumente auswählen, die übertragen werden sollen. */
ScanFormula:="SELECT Form=\"MySqlAmount\";";
/* Quelldatenbank nach passenden Dokumenten scannen und UNIDs sammeln. */
UNIDList:=@ScanDB(SrcDBh;ScanFormula;@AnyAllDay;1;2);
/* Schleife über alle gefundenen UNIDs vorbereiten. */
UNIDList_Index:=1;
UNIDList_Ele:=@Elements(UNIDList);
WHILE(UNIDList_Index<=UNIDList_Ele){
/* Aktuelle UNID aus der Liste lesen und zusätzlich als Text aufbereiten. */
ThisNoteUNID:=@GetListElement(UNIDList;UNIDList_Index);
ThisNoteUNIDText:=@GetListElement(@Text(ThisNoteUNID);1);
/* Aktuelles Notes-Dokument über seine UNID öffnen. */
ThisNoteh:=@OpenNoteByUID(SrcDBh;ThisNoteUNID;ThisNoteh;1);
/* Zu übertragende Werte protokollieren. */
@LogReport("UNID :"+ThisNoteUNIDText;3);
@LogReport("Name :"+Name[ThisNoteh];3);
@LogReport("Amount :"+@Text(Amount[ThisNoteh]);3);
/* Prepared Statement mit den Werten aus dem Notes-Dokument ausführen. */
Ret:=@MySQLExecutePreparedStatement(MySql_PrepStat;Name[ThisNoteh];Amount[ThisNoteh];ThisNoteUNIDText);
/* Nur bei erfolgreichem INSERT die erzeugte MySQL-ID lesen und zurückschreiben. */
IF(@IsError(Ret)){
@LogReport(Ret;3);
}ELSE{
/* Die von MySQL erzeugte ID des eingefügten Datensatzes ermitteln. */
ThisQueryInsertedID:=@MySQLGetLastInsertIDPreparedStatement(MySql_PrepStat);
/* Die erzeugte MySQL-ID zurück in das Notes-Dokument schreiben. */
MySQLID[ThisNoteh]:=ThisQueryInsertedID;
@LogReport("MySQLID:"+@Text(MySQLID[ThisNoteh]);3);
}
/* Notes-Dokument speichern und schließen. */
ThisNoteh:=@CloseNote(ThisNoteh;1);
/* Zum nächsten Listeneintrag wechseln. */
@Increment(UNIDList_Index);
} /*WHILE(UNIDList_Index<=UNIDList_Ele)*/
/* Prepared Statement schließen. */
MySql_PrepStat:=@MySQLClosePreparedStatement(MySql_PrepStat);
} /*END ELSE IF(@IsError(MySql_PrepStat))*/
} /*END ELSE IF(@IsError(Ret)) TRUNCATE*/
} /*END ELSE IF(@IsError(Ret)) @MySQLConnect*/
/* MySQL-Verbindung schließen. */
MySQLh:=@MySQLClose(MySQLh);
} /*END ELSE IF(@IsError(MySQLh))*/
/* MySQL-Thread-Kontext beenden bzw. aufräumen. */
@MySQLThreadEnd;
/* Notes-Quelldatenbank schließen. */
SrcDBh:=@CloseDB(SrcDBh);
} /*END ELSE IF(@IsError(SrcDBh))*/
