Trasformare un oggetto C# in stringa SQL
Categories: C, MySQL, Source Code
Tags:
Il post seguente fa parte del progetto SQLStringBuilder. Per le ultime versioni del codice sorgente si consiglia di prelevare il codice dal CVS.
Ogni volta che dobbiamo creare delle query SQL in un linguaggio di programmazione spesso si fa qualcosa che ho sempre reputato sporco, del tipo:
int id = GetTableID();
string place = GetPlace();
DateTime timestamp = GetLastActionDate();
string strTimestamp = Utils.GetSQLDate(DateTime.Now);
string sql = "INSERT INTO table VALUES(" + id + ",'" + place + "'," + timestamp + "')";
Nella creazione della stringa bisogna stare attentissimi alle sequenze di virgolette, virgole e apici vari, e basta sgarrare uno di questi elementi per sminchiare completamente la query! Lo scopo di questo articolo è quello di creare un metodo che prenda in ingresso un oggetto c# qualsiasi e restituisca una stringa formattata nel modo corretto. L’intestazione del metodo è la seguente:
public static string GetSQLObject(object value)
Per capirci meglio, il seguente codice:
DateTime date = DateTime.Now;
string str = "prova";
int n = 3;
MyEnum enum = MyEnum.EnumValue;
bool b = true;
string sql = "INSERT INTO table VALUES(" + GetSQLObject(date) + "," + GetSQLObject(str) + "," +GetSQLObject(n) + "," + GetSQLObject(enum) + "," + GetSQLObject(b) + ")";
Console.Writeline(sql);
stamperà:
L’utilità di questo metodo è bassa se si creano le stringhe SQL a manuzza come fatto sopra, ma diventa fondamentale se si vogliono creare le stringhe SQL programmaticamente, per esempio con dei cicli for.
INSERT INTO table VALUES data,'prova',
Inserisco un pezzettino di codice esplicativo più di mille parole per fare capire cosa fa la funzione
public static string GetSQLObject(object value)
{
// se l'oggetto è una stringa
if (value is String)
return "'" + Utils.GetSQLCleanString((String)value) + "'";
// se l'oggetto è un char
else if (value is char)
return "'" + Utils.GetSQLCleanString(value) + "'";
// se l'oggetto è una data
else if (value is DateTime)
return "'" + Utils.GetSQLDate((DateTime)value) + "'";
// seguono i cast di un bel pò di tipi ....
// ....
}
Come si vede il metodo va controllando il tipo dell’oggetto passato ed esegue un azione diversa per ogni tipo: per esempio se l’oggetto è una stringa o un carattere invoca il metodo GetSQLCleanString (vedi Ottenere una stringa pulita SQL) e aggiunge le virgolette prima e dopo, mentre per la data chiama il metodo GetSQLDate (vedi Convertire un oggetto DateTime C# in un campo SQL).
Nel codice sorgente ovviamente sono inclusi i cast di altri tipi, per esempio un array di byte viene salvato in Blob attraverso il metodo descritto nel post Salvare un Blob MySQL in C#, un boolean convertito nel valore numerico 0-1 e così via.
Ovviamente se mi sono scordato qualche conversione di tipo fatemi sapere, che sistemo subito :).
Download GetSQLObject. Downloads: 240
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
18 Mar 2007 dzamir