如何将取得----------------------------------带参数的SqlCommand 对象的完整的SQL语句?

雄牛 2017-04-30 05:02:17
cmd.ToString()打印出来的不对...

网上找好都找不到,因为需要取得完整的SQL指令用于其它地方.


public static int ExecuteNonQuery(string sql, SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(conn))
{

con.Open();
SqlCommand cmd = new SqlCommand();//sql, con

//创建一个事务
SqlTransaction myTran = con.BeginTransaction();
try
{
cmd.Connection = con;
cmd.CommandText = sql;
cmd.Transaction = myTran;
cmd.Parameters.AddRange(parameters);
int Count = cmd.ExecuteNonQuery();

myTran.Commit();//提交事务

SendLocal(cmd.ToString());//发送SQL语句给本地文件生成记录.此为特定方法

return Count;
}
catch (System.Exception ex)
{
myTran.Rollback();//回滚事务
return 0;
}
}
}
...全文
572 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
clicker8 2017-06-29
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
哎呀 你这最终的结果 都不是"参数化"了.. 你只要使用参数化 最终的SQL是没办法查看的 想问为什么 你可以去咨询微软. 不过微软只能呵呵你, 你最终的方法 虽然得到了sql语句..但是本质上 他就是拼字符串..根本没有参数化的方式 一个拼字符串 你还不如直接传sql来的快呢....你说你何必呢....
我就想记录sql的log,你没有必要不代表别人也没这需求,另外建议用EF6.1的未必有点太小题大作了,不现实,楼上的代码有点不到位啊,我找了一个还不错的: http://www.it1352.com/372885.html
clicker8 2017-06-29
  • 打赏
  • 举报
回复
我就想记录sql的log,你没有必要不代表别人也没这需求,另外建议用EF6.1的未必有点太小题大作了,不现实,楼上的代码有点不到位啊,我找了一个还不错的: http://www.it1352.com/372885.html
by_封爱 版主 2017-05-03
  • 打赏
  • 举报
回复
哎呀 你这最终的结果 都不是"参数化"了.. 你只要使用参数化 最终的SQL是没办法查看的 想问为什么 你可以去咨询微软. 不过微软只能呵呵你, 你最终的方法 虽然得到了sql语句..但是本质上 他就是拼字符串..根本没有参数化的方式 一个拼字符串 你还不如直接传sql来的快呢....你说你何必呢....
雄牛 2017-05-03
  • 打赏
  • 举报
回复
引用 8 楼 crystal_lz 的回复:
[quote=引用 7 楼 cowbo 的回复:] stackoverflow找到解决方法了 public static class DbHelper { public static string ToString(this DbParameterCollection parameters, string sqlQuery) { return parameters.Cast<DbParameter>().Aggregate(sqlQuery, (current, p) => current.Replace(p.ParameterName, p.Value.ToString())); } }
你称这个为 解决办法?。。难道你就看不出来 这不就是字符串替换么 把你sqlText里面的占位字符串替换成 你param里面的value而已 而且这样替换出来的语句 压根还不一定能正确执行 谁知道value.ToString() 出来是什么样的字符串 要是value里面本来就是sql关键字呢?或者说value压根就不是字符串类型 二十一个其他的二进制数据类型 你觉得ToString出来是啥东西? 上面版主也说了 除非你的数据库不支持预编译 不然不会字符串拼接 会把你的sqltext和param编译成一个数据库能执行从程序 而不是一个字符串[/quote] 上面的方法不能解决字符串的问题,最终用了下面的方法:

ublic static string ToSQL(SqlCommand cmd, string sqlQuery)
          {
                  StringBuilder sbRetVal=new StringBuilder();

                  foreach (SqlParameter item in cmd.Parameters)
                  {

                      switch (item.DbType)
                      {
                          case DbType.String:
                              sbRetVal.AppendFormat("DECLARE {0} AS VARCHAR(255)", item.ParameterName);
                              sbRetVal.AppendLine();
                              sbRetVal.AppendFormat("SET {0} = '{1}'", item.ParameterName, item.Value);
                              sbRetVal.AppendLine();
                              break;
                          case DbType.DateTime:
                              sbRetVal.AppendFormat("DECLARE {0} AS DATETIME", item.ParameterName);
                              sbRetVal.AppendLine();
                              sbRetVal.AppendFormat("SET {0} = '{1}'", item.ParameterName, item.Value);
                              sbRetVal.AppendLine();
                              break;
                          case DbType.Guid:
                              sbRetVal.AppendFormat("DECLARE {0} AS UNIQUEIDENTIFIER", item.ParameterName);
                              sbRetVal.AppendLine();
                              sbRetVal.AppendFormat("SET {0} = '{1}'", item.ParameterName, item.Value);
                              sbRetVal.AppendLine();
                              break;
                          case DbType.Int32:
                              sbRetVal.AppendFormat("DECLARE {0} AS int", item.ParameterName);
                              sbRetVal.AppendLine();
                              sbRetVal.AppendFormat("SET {0} = {1}", item.ParameterName, item.Value);
                              sbRetVal.AppendLine();
                              break;
                          default:
                              sbRetVal.AppendFormat("DECLARE {0} AS int", item.ParameterName);
                              sbRetVal.AppendLine();
                              sbRetVal.AppendFormat("SET {0} = {1}", item.ParameterName, item.Value);
                              sbRetVal.AppendLine();
                              break;
                      }
                  }

                sbRetVal.AppendLine("");
                sbRetVal.AppendLine(cmd.CommandText);

                string resultSQL = sbRetVal.ToString();
                resultSQL = resultSQL.Replace("\r\n", " ");//去掉格式

                return resultSQL;
                
          }
wang_peng_yl 2017-05-02
  • 打赏
  • 举报
回复
你这种方式看不到的,.net驱动里没有给你暴露出来 除非你自己改驱动,那难度过大了去了。
孟子E章 2017-05-01
  • 打赏
  • 举报
回复
你参考下这个文章吧 http://blog.csdn.net/rj532029887/article/details/51227186
crystal_lz 2017-05-01
  • 打赏
  • 举报
回复
引用 7 楼 cowbo 的回复:
stackoverflow找到解决方法了 public static class DbHelper { public static string ToString(this DbParameterCollection parameters, string sqlQuery) { return parameters.Cast<DbParameter>().Aggregate(sqlQuery, (current, p) => current.Replace(p.ParameterName, p.Value.ToString())); } }
你称这个为 解决办法?。。难道你就看不出来 这不就是字符串替换么 把你sqlText里面的占位字符串替换成 你param里面的value而已 而且这样替换出来的语句 压根还不一定能正确执行 谁知道value.ToString() 出来是什么样的字符串 要是value里面本来就是sql关键字呢?或者说value压根就不是字符串类型 二十一个其他的二进制数据类型 你觉得ToString出来是啥东西? 上面版主也说了 除非你的数据库不支持预编译 不然不会字符串拼接 会把你的sqltext和param编译成一个数据库能执行从程序 而不是一个字符串
雄牛 2017-05-01
  • 打赏
  • 举报
回复
stackoverflow找到解决方法了 public static class DbHelper { public static string ToString(this DbParameterCollection parameters, string sqlQuery) { return parameters.Cast<DbParameter>().Aggregate(sqlQuery, (current, p) => current.Replace(p.ParameterName, p.Value.ToString())); } }
雄牛 2017-05-01
  • 打赏
  • 举报
回复
引用 4 楼 net_lover 的回复:
你是想看最终的sql语句吧?可以使用sql server profiler http://blog.csdn.net/dcx903170332/article/details/45917387
需要在程序端打印机SQL完整的语句,CommandText出来的语句是不全的..
xuzuning 2017-04-30
  • 打赏
  • 举报
回复
除非你的数据库不支持 prepare 指令,否则不会进行拼接
孟子E章 2017-04-30
  • 打赏
  • 举报
回复
你是想看最终的sql语句吧?可以使用sql server profiler http://blog.csdn.net/dcx903170332/article/details/45917387
雄牛 2017-04-30
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
CommandText ???
不是这个,这个打印现搂语句,值都是@values这样,但我们需要原始的SQL语句
JustWantToFly 2017-04-30
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
CommandText ???
我觉得他可能是要看参数值赋上后执行的sql语句,这个是不是看不到?
xuzuning 2017-04-30
  • 打赏
  • 举报
回复
CommandText ???

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧