有没有办法在param替换后从SqlCommand获取完整的sql文本?

Toa*_*oad 5 .net sql-server ado.net

我创建了一个带有参数的SQL查询的SqlCommand.我将所有参数添加到类中.

是否有一种简单的方法可以在将结果发送到数据库之前查看生成的SQL查询?

这对于调试来说非常方便.(例如,复制整个查询并在管理工作室中运行以尝试查明问题)

[R

Tho*_*que 4

不,因为实际上没有发生任何替代。查询按原样传递到服务器,参数单独传递。

但是,您可以编写一种方法来用实际参数值替换参数占位符...这就是我在我的一个应用程序中所做的,我将尽快发布代码。


这是我使用的代码,但它适用于 Oracle Lite 数据库,因此需要进行一些调整才能将其与另一个 RDBMS 一起使用。

    public void Log(IDbCommand cmd)
    {
        StringBuilder sb = new StringBuilder(cmd.CommandText);
        for (int i = 0; i < cmd.Parameters.Count; i++)
        {
            int pos = sb.ToString().IndexOf("?");
            if (pos > 0)
                sb.Replace("?", FormatParameter(cmd.Parameters[i]), pos, 1);
        }
        Log(sb.ToString());
    }

    private string FormatParameter(object prm)
    {
        IDbDataParameter p = prm as IDbDataParameter;
        if (p.Value == null || p.Value == DBNull.Value)
            return "NULL";
        switch (p.DbType)
        {
            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
                string s = p.Value as string;
                return string.Format("'{0}'", s.Replace("'", "''"));

            case DbType.Binary:
                byte[] b = p.Value as byte[];
                return HexString(b);

            case DbType.Date:
            case DbType.DateTime:
            case DbType.DateTime2:
                DateTime d = (DateTime)p.Value;
                return string.Format("to_date('{0}', 'dd/mm/yyyy hh24:mi')", d.ToString("dd/MM/yyyy HH:mm"));

            default:
                return p.Value.ToString();
        }
    }

    private string HexString(byte[] bytes)
    {
        StringBuilder sb = new StringBuilder();
        for (int i=0; i < bytes.Length; i++)
            sb.AppendFormat("{0:X2}", bytes[i]);
        return sb.ToString();
    }
Run Code Online (Sandbox Code Playgroud)