2014-06-18 6 views
9

Appena prima di eseguire una query SQL su un database MySQL in C#, desidero registrare la query che verrà eseguita. Quello che ho ora registra solo ora SELECT * FROM foo WHERE Id = @Id dove vorrei vedere SELECT * FROM foo WHERE Id = 5. Come lo faccio?Ottenere la stringa di query SQL da DbCommand con i parametri

DbCommand dbCommand = dbFactory.CreateCommand(); 
    dbCommand.CommandText = "SELECT * FROM foo WHERE Id = @Id"; 

    DbParameter param = dbCommand.CreateParameter(); 
    param.ParameterName = "@Id"; 
    param.Value = 5; 

    dbCommand.Parameters.Add(param); 

    dbConnection.Open(); 
    Log.AddVerbose(String.Format("SQL query: {0}", dbCommand.CommandText)); 
    dbCommand.ExecuteReader(); 
+1

Dipende dal sistema di ** effettivo, concreto banca dati ** si sta usando - non tutti i database relazionali che utilizzano SQL ** ** come il loro lavoro di query lingua esattamente allo stesso modo ..... si prega aggiorna i tuoi tag con il sistema di database pertinente! –

+0

Il sistema di database in questione è MySQL, post aggiornato e tag aggiunti – BioGeek

+2

Ciò dipende in parte dal sistema DB, ma per qualsiasi DB che valga la pena utilizzare, la stringa che stai cercando ** non esiste mai **, nemmeno sul server di database . Questo è il punto centrale delle query parametrizzate: mantenere questi dati separati dal codice. Ecco perché i parametri di query sono così importanti per prevenire gli attacchi di SQL injection: i dati dannosi non sono mai vicini alla stringa di SQL. –

risposta

14

Se si tenta di accedere si può fare un metodo di estensione come questo.

public static string GetGeneratedQuery(this SqlCommand dbCommand) 
{ 
    var query = dbCommand.CommandText; 
    foreach (var parameter in dbCommand.Parameters) 
    { 
      query = query.Replace(parameter.ParameterName, parameter.Value.ToString()); 
    } 

    return query; 
} 

E puoi usarlo in questo modo.

Log.AddVerbose(String.Format("SQL query: {0}", GetGeneratedQuery(dbCommand))); 
+1

Si noti che questo funziona solo con parametri denominati. Se sei su un database con semplici '?' Segnaposto, hai invece una corrispondenza sull'ordine. –

+0

Accetto, ma OP sta utilizzando SqlCommand con i parametri denominati – Anuraj

+1

C'è un problema. Se il valore param è un tipo String, il valore sarà con apostrofi, ma con l'esempio sopra non viene eseguito. [Ecco una soluzione più completa] (http://stackoverflow.com/questions/5356467/from-net-can-i-get-the-full-sql-string-generated-by-a-sqlcommand-object-with -S) –

Problemi correlati