数据库的操作都是使用的参数化来执行,现在需要记录日志,则需要记录下来完整执行的sql语句。这样参数化的就得不到完整的sql语句都是参数,没有值,我采用自己拼接的方式,但是工程量太大了,我个人觉得即使是参数化的执行方式,到底来说还是执行的sql,ado中应该可以获取的,请指教?

解决方案 »

  1.   

    参数化的sql语句比较好,你的日志可以把sql语句+参数的值一起保存下来呀
      

  2.   

    http://topic.csdn.net/u/20091128/11/7d4ccb82-5f6f-4615-b226-a1678c597d32.html
      

  3.   

            /// <summary> 概述:将一个命令对象的信息输出到调试面板。仅用于【DEBUG】模式。
            /// </summary>
            /// <param name="message">执行【DbCommand】的函数名。</param>
            /// <param name="command">命令对象。</param>
            /// <param name="ret">执行【DbCommand】的返回值。可以为【null】。</param>
            [System.Diagnostics.Conditional("DEBUG")]
            public static void WriteToDebug(string message, DbCommand command, object ret)
            {
                string commS = command.CommandText;            foreach (DbParameter item in command.Parameters)
                {
                    commS = System.Text.RegularExpressions.Regex.Replace(commS, item.ParameterName, "'" + (item.Value ?? "null").ToString() + "'", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                }
                WriteToDebug("【页面】:" + (System.Web.HttpContext.Current == null ? "非Web应用程序" : System.Web.HttpContext.Current.Request.RawUrl) +
                            "\r\n【执行】:" + message +
                            "\r\n【语句】:" + commS +
                            "\r\n【返回】:" + (ret == null ? "可能执行失败" : ret));
            }
      

  4.   

    打开sql profiler,选中“保存到文件”选项。然后自己分析。这个工具还有其他丰富的选项,这个连接我觉得说的已经比较清楚了(英文):
    配置sql profiler另外还可看联机丛书等
      

  5.   

    带参数的sql执行不是直接发你想要的sql语句,估计只能自己取参数值拼接。
    否则在SQL Server的服务器端编程了。
      

  6.   

    using System;
    using System.Data;
    using System.Data.SqlClient;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (SqlConnection conn = new SqlConnection("server=.;database=sql2005;user id=sa;password=sqlsa;min pool size=4;max pool size=100;Connection Lifetime=30;Enlist=true;"))
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand("SELECT Name FROM Student WHERE Id=@Id And Age=@Age", conn))
                    {
                        cmd.Parameters.Add("@Id", SqlDbType.Int);
                        cmd.Parameters[0].Value = "14";
                        cmd.Parameters.Add("@Age", SqlDbType.Int);
                        cmd.Parameters[1].Value = "21";                    Console.WriteLine(cmd.ExecuteScalar());                    //输出完整SQL,SELECT Name FROM Student WHERE Id=14 And Age=21
                        Console.WriteLine(GetCommandText(cmd.CommandText, cmd.Parameters));
                    }
                    conn.Close();
                }
            
                Console.Read();        }        /// <summary>
            /// 从参数化查询获取完整SQL
            /// </summary>
            /// <param name="commandtext"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            static string GetCommandText(string commandtext, SqlParameterCollection parameters)
            {
                foreach (SqlParameter parameter in parameters)
                    commandtext = commandtext.Replace(parameter.ParameterName, parameter.Value is String ? parameter.Value.ToString() : parameter.ParameterName);            return commandtext;
            }    }
    }
      

  7.   

    如果用sql server的话,建议使用事件探测器。它可以还原一段时间内程序与数据库的会话状态和所有数据库执行过的sql.分析它探测的结果就行了,程序不用做任何改的。