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