gpt4 book ai didi

sql-server - 我可以从 .NET 获取 SqlCommand 对象(带有 SQL 参数)生成的完整 SQL 字符串吗?

转载 作者:行者123 更新时间:2023-12-02 17:42:06 25 4
gpt4 key购买 nike

从 .NET 环境中,我可以访问 SqlCommand 生成的完整 SQL 字符串。目的?

注意:在 Debug模式下,完整的 SQL 字符串会显示在 VisualStudio 中的 Intellisense 悬停中。

如果必须的话,我愿意使用反射技术。我确信这里有人知道一种方法来实现它。

<小时/>

更新 1:
我正在调用一个带有 cmd.CommandType = CommandType.StoredProcedure 参数的存储过程,并尝试获取生成并运行的完整 SQL。我想知道是否有cmd。 Prepare()如果该方法可能将完整字符串存储在状态字段或类似字段中,则在这种情况下可能没有用处。

<小时/>

更新2:

根据下面(和引用的)答案表明在准备或执行期间内部没有生成完整的 SQL 字符串,我使用 .NET Reflector 进行了一些探索。甚至内部连接类似乎也传递对象而不是将它们简化为字符串,例如:

内部抽象 void AddPreparedCommand(SqlCommand cmd);
声明类型:System.Data.SqlClient.SqlInternalConnection
程序集:System.Data,版本=2.0.0.0

<小时/>

总的来说,感谢大家提供的详细信息,以证明可以做什么并展示实际发生的情况。非常感激。我喜欢详尽的解释;它们增加了保证并为答案提供了可信度。

最佳答案

一个简单的循环将所有参数名称替换为其值,将为您提供类似于最终结果的结果,但存在几个问题。

  1. 由于 SQL 从未真正使用参数值重建,因此不需要考虑换行符和引号之类的内容
  2. 注释中的参数名称从未实际处理其值,而是保持原样

有了这些,并考虑到以相同字符开头的参数名称,例如 @NAME@NAME_FULL,我们可以将所有参数名称替换为代替该参数的值:

string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}

但是,这还剩下一个问题,那就是如果参数是字符串,那么 SQL 最初看起来像这样:

SELECT * FROM yourtable WHERE table_code = @CODE

看起来像这样:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

这显然不是合法的 SQL,因此我们还需要考虑一些参数类型:

DbType[] quotedParameterTypes = new DbType[] {
DbType.AnsiString, DbType.Date,
DbType.DateTime, DbType.Guid, DbType.String,
DbType.AnsiStringFixedLength, DbType.StringFixedLength
};
string query = cmd.CommandText;

var arrParams = new SqlParameter[cmd.Parameters.Count];
cmd.Parameters.CopyTo(arrParams, 0);

foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
{
string value = p.Value.ToString();
if (quotedParameterTypes.Contains(p.DbType))
value = "'" + value + "'";
query = query.Replace(p.ParameterName, value);
}

关于sql-server - 我可以从 .NET 获取 SqlCommand 对象(带有 SQL 参数)生成的完整 SQL 字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356467/

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