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 !!!