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à:

INSERT INTO table VALUES data,'prova',
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.
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