有没有办法拦截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&#34);`
我在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,但我无法在存储过程中添加额外的参数。我试着看看其他问题,但没有运气:
答案 0 :(得分:1)
如果是CommandType = CommandType.StoredProcedure
,则无法做到这一点。
为什么呢?您在SQL事件探查器中看到的SQL不是由客户端生成的。 : - /
当SqlCommand执行CommandType.StoredProcedure
命令时,它会向SQL Server发送一个execute remote procedure call message,其中包含存储过程的名称和包含这些参数的数据结构。
在服务器端生成TextData
/ RPC:Starting
事件的RPC:Completed
SQL事件探查器显示。由于此文本不是客户端生成的,因此无法在客户端修改它。
答案 1 :(得分:0)
您所看到的是调试/配置文件消息,但这并不能完美地表示实际执行的内容(数据库将在幕后使用sp_executesql()
)。
您所寻找的内容并不存在。使用参数对象的重点是参数值 NEVER ,随时,作为sql命令字符串的一部分包含在内,甚至在服务器上
这完成了三件主要的事情:
如果要获取调试数据,请编写一个方法来输出查询以及随之而来的参数数据。如果要在配置文件跟踪中添加信息,可以切换到CommandType.Text
并通过自己的EXEC procedurename @param1, @param2, ... @paramN -- INFO HERE
字符串调用存储过程。