2009-06-11 11 views
2

時々、SubSonicが生成するSQL文を確認する必要があります。パラメータ(SELECT ... WHERE productname = ?productname)でクエリを返すしかしSubSonic SqlQueryオブジェクトをプレーンSQLに変換する拡張メソッド

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

Console.WriteLine(qry.BuildSqlStatement()); 

:との素晴らしい作品

。だから、私はいつも自分のコードで実際の値を見つけ、そのパラメータを複雑なクエリーで本当に迷惑になるようなプロッパフォーマットの値(productname = 'Productname'など)に置き換える必要があります。

私は共有したい拡張メソッドを作ることに決めました(コードの答えを見てください)。

+0

特定の質問がありますか?それ以外の場合は、この質問の一部ではなく、あなたのソリューションを回答として投稿することをお勧めします。おそらくコミュニティウィキにしてください。 – Noldorin

答えて

2

これは完璧ではありませんが、今は私のニーズに合っています。

しかし、私はクリップボードと、それはクエリブラウザから私のDBをagains実行するために結果をコピーし

Console.WriteLine(qry.BuildSqlStatementDebug()); 

を使用することができます。

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(); 
     } 

    } 

} 

} 
関連する問題