拦截SqlCommand在数据库上执行的查询

时间:2011-02-23 17:15:41

标签: c# sql-server ado.net

是否有可能拦截给定SqlCommand将在数据库上执行的查询?

我想跟踪我的Data类调用的所有查询的调试目的,并且无法找到一种聪明的方法来执行此操作。

我试图使用sql命令字符串的一些奇怪的“替换”,或者用一个时髦的附加参数

sb.AppendLine("@" + p.ParameterName + " = " + p.ToDebugString());

(“ToDebugString()”是一个扩展方法,它使用或不使用单引号执行“ToString()”,具体取决于它是否为字符串)

但这似乎有点不专业,当它遇到

时它会失败
SqlDbType.Structured

参数。

或多或少,我想以与SqlServer Profiler在数据库本身内部相同的方式拦截应用程序内部的数据库调用。

提前谢谢。

BIG EDIT:

我知道这给出了一个简单的查询:

SELECT * FROM MyTable WHERE ID=@ID

而不是像这样运行它:

SELECT * FROM MyTable WHERE ID=1234

数据库实际上运行如下过程:

DECLARE @ID int
SET @ID = 1234
SELECT * FROM MyTable WHERE ID=@ID

我可以在应用程序级拦截最后一个块吗?

1 个答案:

答案 0 :(得分:5)

听起来您希望在查询字符串中直接替换参数“就像在服务器上完成的那样”。这是不可能的,因为服务器永远不会将参数替换为字符串。这就是参数化查询的美妙之处:数据是数据,代码是代码,而不是twain应该满足。

给出一个简单的查询:

SELECT * FROM MyTable WHERE ID=@ID

而不是像这样运行它:

SELECT * FROM MyTable WHERE ID=1234

您可以将其视为数据库实际运行如下过程:

DECLARE @ID int
SET @ID = 1234
SELECT * FROM MyTable WHERE ID=@ID