Borland C++ Builder vient avec TSQLQuery et certaines fonctionnalités très intéressantes, surtout les PreparedStatements.

Exemple:
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
  }
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
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;
}
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 ?

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
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 ");
il suffit d'écrire ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
query->SQL->Text = "SELECT * 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.

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
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();
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.

Bon amusement

PS : Mon secret ? La doc !!!