sh0*_*ama 2 c# sql-server ado.net
是否有可能拦截给定SqlCommand将在数据库上执行的查询?
我想跟踪我的Data类调用的所有查询的调试目的,并且找不到一个聪明的方法来执行此操作.
我试图使用一些奇怪的"替换"sql命令字符串,或者附加一个时髦的参数
sb.AppendLine("@" + p.ParameterName + " = " + p.ToDebugString());
Run Code Online (Sandbox Code Playgroud)
("ToDebugString()"是一个扩展方法,它使用或不使用单引号执行"ToString()",具体取决于它是否为字符串)
但这似乎有点不专业,当它遇到一个时它就会失败
SqlDbType.Structured
Run Code Online (Sandbox Code Playgroud)
参数.
或多或少,我想以与SqlServer Profiler在数据库本身内部相同的方式拦截应用程序内部的数据库调用.
先感谢您.
大编辑:
我知道给出一个像这样的简单查询:
SELECT * FROM MyTable WHERE ID=@ID
Run Code Online (Sandbox Code Playgroud)
而不是像这样运行它:
SELECT * FROM MyTable WHERE ID=1234
Run Code Online (Sandbox Code Playgroud)
数据库实际上运行如下过程:
DECLARE @ID int
SET @ID = 1234
SELECT * FROM MyTable WHERE ID=@ID
Run Code Online (Sandbox Code Playgroud)
我可以在应用程序级拦截最后一个块吗?
听起来你似乎想要在查询字符串中直接替换参数"就像在服务器上完成的那样".这是不可能的,因为服务器永远不会将参数替换为字符串.这就是参数化查询的美妙之处:数据是数据,代码是代码,而不是twain应该满足.
给出一个像这样的简单查询:
SELECT * FROM MyTable WHERE ID=@ID
Run Code Online (Sandbox Code Playgroud)
而不是像这样运行它:
SELECT * FROM MyTable WHERE ID=1234
Run Code Online (Sandbox Code Playgroud)
您可以将其视为数据库实际运行如下过程:
DECLARE @ID int
SET @ID = 1234
SELECT * FROM MyTable WHERE ID=@ID
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1750 次 |
| 最近记录: |