2009-06-11 6 views
2

J'ai parfois besoin de voir quelle instruction SQL SubSonic génère.Méthode d'extension pour convertir l'objet SqlQuery SubSonic en SQL brut

Cela fonctionne très bien avec:

SqlQuery qry = DB.Select().From<Product>() 
       .Where(Products.Columns.Name).IsEqualTo("Productname"); 

Console.WriteLine(qry.BuildSqlStatement()); 

Cependant qui retourne la requête avec des paramètres (SELECT ... WHERE productname = ?productname). Donc, je dois toujours trouver les vraies valeurs dans mon code et remplacer les paramètres avec la valeur formatée par propper (par exemple productname = 'Productname') qui peut être vraiment ennuyeux avec des requêtes complexes. Donc, j'ai décidé de faire une méthode d'extension que je veux partager (regardez ma réponse pour le code).

+0

Avez-vous une question précise? Sinon, je vous suggère de poster votre solution en guise de réponse plutôt que de faire partie de cette question (et de la rendre éventuellement wiki communautaire) - elle sera probablement fermée autrement. – Noldorin

Répondre

2

Il est loin d'être parfait, mais il correspond à mes besoins pour l'instant.

Mais je peux utiliser

Console.WriteLine(qry.BuildSqlStatementDebug()); 

puis copiez le résultat le Presse-papiers et l'exécuter agains mon DB de Query Browser.

using System; 
using SubSonic; 

namespace MyNamespace.ExtensionMethods 
{ 

public static class SubsonicSqlQueryExtensionMethods 
{ 

    public static String BuildSqlStatementDebug(this SqlQuery qry) 
    { 

     var result = qry.BuildSqlStatement(); 

     foreach (var c in qry.Constraints) 
     { 

      if (c.Comparison == Comparison.BetweenAnd) 
      { 
       result = result.Replace(c.ParameterName + "_start", GetFormattedValue(c.StartValue, c.DbType)); 
       result = result.Replace(c.ParameterName + "_end", GetFormattedValue(c.EndValue, c.DbType)); 
      } 
      else 
      { 
       result = result.Replace(c.ParameterName, GetFormattedValue(c.ParameterValue, c.DbType)); 
      } 

     } 

     return result; 

    } 

    // Works for MySQL 
    private static readonly String formatter_date = "'{0:yyyy-MM-dd}'"; 
    private static readonly String formatter_datetime = "'{0:yyyy-MM-dd hh:mm:ss}'"; 

    private static readonly String formatter_string = "'{0}'"; 

    private static String GetFormattedValue(Object value, System.Data.DbType type) 
    { 

     switch (type) 
     { 
      case System.Data.DbType.AnsiString: 
       return String.Format(formatter_string, value); 
      case System.Data.DbType.AnsiStringFixedLength: 
       return String.Format(formatter_string, value); 
      //case System.Data.DbType.Binary: 
      // break; 
      case System.Data.DbType.Boolean: 
       return (Boolean)value == true ? "true" : "false"; 
      //case System.Data.DbType.Byte: 
      // break; 
      //case System.Data.DbType.Currency: 
      // break; 
      case System.Data.DbType.Date: 
       return String.Format(formatter_date, value); break; 
      case System.Data.DbType.DateTime: 
       return String.Format(formatter_datetime, value); break; 
      case System.Data.DbType.DateTime2: 
       return String.Format(formatter_datetime, value); break; 
      //case System.Data.DbType.DateTimeOffset: 
      // break; 
      //case System.Data.DbType.Decimal: 
      // break; 
      //case System.Data.DbType.Double: 
      // break; 
      case System.Data.DbType.Guid: 
       return String.Format(formatter_string, value); 
      //case System.Data.DbType.Int16: 
      // break; 
      //case System.Data.DbType.Int32: 
      // break; 
      //case System.Data.DbType.Int64: 
      // break; 
      //case System.Data.DbType.Object: 
      // break; 
      //case System.Data.DbType.SByte: 
      // break; 
      //case System.Data.DbType.Single: 
      // break; 
      case System.Data.DbType.String: 
       return String.Format(formatter_string, value); 
      case System.Data.DbType.StringFixedLength: 
       return String.Format(formatter_string, value); 
      //case System.Data.DbType.Time: 
      // break; 
      //case System.Data.DbType.UInt16: 
      // break; 
      //case System.Data.DbType.UInt32: 
      // break; 
      //case System.Data.DbType.UInt64: 
      // break; 
      //case System.Data.DbType.VarNumeric: 
      // break; 
      case System.Data.DbType.Xml: 
       return String.Format(formatter_string, value); 
      default: 
       return value.ToString(); 
     } 

    } 

} 

} 
Questions connexes