Dapper的SQL语句和参数,一般形式如下:
public static t_User RunLogin(string userName, string pwd)
{
var user = DapperHelper<t_User>
.QueryFirstOrDefault("select * from [t_User] where IsValid=1 and UserName=@UserName and PassWord=@PassWord",
new { UserName = userName, PassWord = pwd });
return user;
}
调试的时候不是很方便,参数值和SQL语句是分离的...
怎样吧参数的值替换到Sql语句对应的位置上面?让他变成:
select * from [t_User] where IsValid=1 and UserName='admin' and PassWord='admin01'
这个样子....
思路:只要把object型的匿名对象param转换一下,做成一个包含了key和value的数组,key就是参数名,value就是参数值,只要遍历一下参数集合,把SQL语句的 value值 去替换 @+key的字符串 即可:
/// <summary>
/// 查看Dapper最终生成的SQL语句
/// </summary>
public class KeyValue
{
public string Key { get; set; }
public string Value { get; set; }
public static string GetSqlStr(string sql, object param = null)
{
try
{
string tempSql = sql;
if (param != null)
{
if (param.ToString().Contains("{") && param.ToString().Contains("}"))//匿名类型
{
string[] arr = param.ToString().Replace("{", "").Replace("}", "").Split(',');
List<KeyValue> paramList = new List<KeyValue>();
foreach (var item in arr)
{
KeyValue kv = new KeyValue();
string[] temp = item.Split('=');
kv.Key = temp[0].Trim();
kv.Value = temp[1].Trim();
paramList.Add(kv);
}
foreach (var par in paramList)
{
tempSql = tempSql.Replace("@" + par.Key, "'" + par.Value + "'");
}
}
else//自定义实体类型
{
Type type = param.GetType();
foreach (PropertyInfo p in type.GetProperties())
{
var Key = p.Name;
var Value = p.GetValue(param);
tempSql = tempSql.Replace("@" + Key, "'" + Value + "'");
}
}
}
return tempSql;
}
catch
{
return sql;
}
}
}
调用此方法:
string sqlStr = KeyValue.GetSqlStr(sql, param);//仅供调试用的SQL语句
举例:
public static T QueryFirstOrDefault(string sql, object param = null)
{
string sqlStr = KeyValue.GetSqlStr(sql, param);//仅供调试用的SQL语句
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
return con.Query<T>(sql, param).ToList().FirstOrDefault();
}
catch
{
return default(T);
}
}
}
实际效果:
终于可以直接复制拼接好参数值的SQL语句到sqlserver2014里粘贴执行起来看结果了....
可能生成的SQL语句也有意想不到的情况,但稍微改一下就行了...
自用 DapperHelper:https://blog.csdn.net/djk8888/article/details/108726056