C# 将亚音速SqlQuery对象转换为普通SQL的扩展方法
我有时需要看看亚音速SQL语句生成了什么 这在以下方面非常有效:C# 将亚音速SqlQuery对象转换为普通SQL的扩展方法,c#,sql,subsonic,C#,Sql,Subsonic,我有时需要看看亚音速SQL语句生成了什么 这在以下方面非常有效: SqlQuery qry = DB.Select().From<Product>() .Where(Products.Columns.Name).IsEqualTo("Productname"); Console.WriteLine(qry.BuildSqlStatement()); SqlQuery qry=DB.Select().From() .Where(Products.C
SqlQuery qry = DB.Select().From<Product>()
.Where(Products.Columns.Name).IsEqualTo("Productname");
Console.WriteLine(qry.BuildSqlStatement());
SqlQuery qry=DB.Select().From()
.Where(Products.Columns.Name).IsEqualTo(“产品名称”);
Console.WriteLine(qry.BuildSqlStatement());
但是,这将返回带参数的查询(SELECT…WHERE productname=?productname
)。因此,我总是必须在代码中找到真正的值,并用propper格式的值(例如,productname='productname')替换参数,这对于复杂的查询来说非常烦人
所以,我决定做一个我想分享的扩展方法(看看我的代码答案)。它还远远不够完美,但它现在适合我的需要 但我可以用
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();
}
}
}
}
你有具体的问题吗?否则,我建议你将你的解决方案作为一个答案而不是这个问题的一部分发布(也许让它成为社区维基)——否则它可能会被关闭。