c# - 拦截SqlCommand对数据库执行的查询

标签 c# sql-server ado.net

是否可以以某种方式拦截给定 SqlCommand 将在数据库上执行的查询?

出于调试目的,我想跟踪我的数据类调用的所有查询,但找不到明智的方法来执行此操作。

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

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

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

但这似乎有点不专业,而且当遇到一个问题时会严重失败

SqlDbType.Structured

参数。

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

提前谢谢您。

大编辑:

我知道给定一个像这样的简单查询:

SELECT * FROM MyTable WHERE ID=@ID

而不是像这样运行它:

SELECT * FROM MyTable WHERE ID=1234

数据库实际上运行的过程是这样的:

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

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

最佳答案

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

给出一个像这样的简单查询:

SELECT * FROM MyTable WHERE ID=@ID

而不是像这样运行它:

SELECT * FROM MyTable WHERE ID=1234

您可以将其视为数据库实际上运行这样的过程:

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

关于c# - 拦截SqlCommand对数据库执行的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094348/

相关文章:

c# - Quartz.Net Schedular IsStarted 属性在 UnScheduleJobs、Shutdown、PauseAll、DeleteJobs 和 GetCurrentlyExecutingJob 等之后始终保持 true

c# - Entity Framework 6 - GetExecutionPlan 性能命中

c# - 创建通用检索方法以返回 1 条记录

c# - 在 ADO 中使用 Entity Framework 连接字符串

c# - 为什么即使进程确实存在,Process.WaitForExit 也会抛出 "no process"异常?

c# - 如何获取应用程序的进程名称?

c# - 在word文档中加载在线图片

php - 在 PHP PDO-ODBC、unixODBC 和 FreeTDS 中使用类型化绑定(bind)参数

sql-server - SSIS 2012项目连接管理器错误

C# 和 PostgreSQL