Borland C++ Builder vient avec TSQLQuery et certaines fonctionnalit�s tr�s int�ressantes, surtout les PreparedStatements.
Exemple:
De cette mani�re, cela permet d'�conomiser le code suivant
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 /// Initialisation d'un TSQLQuery std::auto_ptr< TSQLQuery > query( new TSQLQuery( 0 ) ); query->SQLConnection = sqlConnection; query->SQL->Text = "SELECT firstname, lastname, birthdate, sex FROM PEOPLE WHERE ID = :ID"; query->ParamByName("ID")->AsInteger = id; query->Active = true; if( !query->IsEmpty() ) { // to do something }
Pourquoi dans la majorit� des posts que l'on peut voir � ce sujet, je ne vois pas un auto pointeur utilis� pour lib�rer la m�moire dans le cas d'exception ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 TSQLQuery * query = 0; try { query = new TSQLQuery( 0 ); query->SQLConnection = sqlConnection; query->SQL->Clear(); query->SQL->Add( "SELECT firstname, lastname, birthdate, sex "); query->SQL->Add( "FROM PEOPLE "); query->SQL->Add( "WHERE ID = " + IntToStr( id ) ); query->Active = true; if( !query->IsEmpty() ) { // to do something } query->Active = false; delete query; } catch( Exception const & ex ) { if( query ) { delete query; } throw; }
La documentation du TSQLQuery explique bien que lors de la lib�ration de l'instance, le destructeur de la classe d�sactive le query.
De m�me, la m�thode TStrings::Add( str ) de l'attribut TSQLQuery::SQL ne fait que rajouter du texte � la propri�t� AnsiString TSQLQuery::SQL::Text.
Au lieu de ceci
il suffit d'�crire ceci
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 query->SQL->Clear(); query->SQL->Add( "SELECT * " ); query->SQL->Add( "FROM TABLE_NAME ");
Ce code est plus court, et r�alise la m�me chose, il suffit de lire la documentation, voir m�me le code source de la VCL.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2query->SQL->Text = "SELECT * FROM TABLE_NAME";
Pour tout ce qui est param�tres de query, pourquoi ne pas utiliser la m�thode ParamByName ??? Elle s'occupe elle-meme de r�aliser les convertions num�riques (integer, boolean), horaires ( datetime ) et/ou chaine de caract�res.
exemple
De cette mani�re, il n'est pas n�cessaire de devoir remplacer les quotes ou guillemets, de v�rifier les caract�res '\n' ou autres, tout cela se fait automatiquement par le syst�me.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 AnsiString firstname, lastname; TDateTime birthdate; int sex; bool is_actif; std::auto_ptr< TSQLQuery > query( new TSQLQuery( 0 ) ); query->SQLConnection = sqlConnection; query->SQL->Text = "INSERT INTO PEOPLE( FIRSTNAME, LASTNAME, BIRTHDATE, SEX, IS_ACTIF ) " "VALUES( :FIRSTNAME, :LASTNAME, :BIRTHDATE, :SEX, :IS_ACTIF )"; query->ParamByName( "FIRSTNAME" )->AsString = firstname; query->ParamByName( "LASTNAME" )->AsString = lastname; query->ParamByName( "BIRTHDATE" )->AsDateTime = birthdate; query->ParamByName( "SEX" )->AsInteger = sex; query->ParamByName( "IS_ACTIF" )>AsInteger = ( is_actif ? 1 : 0 ); query->ExecSQL();
Bon amusement
PS : Mon secret ? La doc !!!
Partager