gpt4 book ai didi

.net - 有没有办法在参数替换后从 SqlCommand 获取完整的 sql 文本?

转载 作者:行者123 更新时间:2023-12-02 14:52:15 25 4
gpt4 key购买 nike

我创建了一个带有包含参数的 SQL 查询的 SqlCommand。然后我将所有参数添加到类中。

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

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

R

最佳答案

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

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

<小时/>

这是我使用的代码,但它适用于 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();
}

关于.net - 有没有办法在参数替换后从 SqlCommand 获取完整的 sql 文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1254940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com