【发布时间】:2017-08-22 03:41:30
【问题描述】:
有什么方法可以拦截SqlCommand 生成的SQL 吗?
我目前有一个方法可以执行存储过程:
public int ExecSP(string spName, params objec[] params)
{
using (SqlConnection con = new SqlConnection("AdventureWorks"))
using (SqlCommand cmd = new SqlCommand(spName, con))
{
cmd.CommandType = CommandType.StoredProcedure;
//..calls method to add params and values to cmd object
con.Open();
return cmd.ExecuteNonQuery();
}
}
当我使用它来调用以下内容时:
ExecSP("HumanResources.uspUpdateEmployeePersonalInfo", 1, "295847284", new DateTime(1963, 3, 2), "S", "M");`
我在 SQLProfiler 中得到以下信息:
exec HumanResources.uspUpdateEmployeePersonalInfo @BusinessEntityID=1,@NationalIDNumber=N'295847284',@BirthDate='1963-03-02 00:00:00',@MaritalStatus=N'S',@Gender=N'M'
我想做的是截取那个 SQL 命令,这样我就可以在它的末尾添加一个包含一些相关信息的注释,使它看起来像:
exec HumanResources.uspUpdateEmployeePersonalInfo @BusinessEntityID=1,@NationalIDNumber=N'295847284',@BirthDate='1963-03-02 00:00:00',@MaritalStatus=N'S',@Gender=N'M' -- IMPORTANT INFORMATION HERE
我无法将 CommandType 更改为 Text,也无法向存储过程添加额外的参数。我尝试查看这些其他问题,但没有运气:
【问题讨论】:
-
我什么都不知道,但可以在网上找到源代码。您可以创建自己的版本并使用它来完成此操作。
-
我希望尽可能避免这种情况,因为创建自定义版本可能会带来意想不到的错误。不过还是谢谢。
-
可能重复我的一个老问题stackoverflow.com/questions/29153589/…
-
@ScottChamberlain 是的,这非常相似。感谢您的链接。你能实现它吗?
-
没有。由于编写解析器的时间问题,我们采用了不同的方法。项目完成几个月后,得到了接受的答案。
标签: c# sql-server ado.net sqlcommand sql-server-profiler