ADO.NET 中参数化 SQL 命令的最终形式

Posted

技术标签:

【中文标题】ADO.NET 中参数化 SQL 命令的最终形式【英文标题】:Final form of parametric SQL commands in ADO.NET 【发布时间】:2010-04-28 19:26:58 【问题描述】:

当我通过 ADO.NET 从我的 C# 程序向 Access 发送参数化查询时遇到语法错误。

当然,我知道我的代码中包含了哪些 SQL 字符串,其中嵌入了参数名称。

有谁知道我在调用cmd.ExecuteNonQuery 之后如何查看最终发送到 DBMS 的 SQL 字符串?

谢谢。

编辑:

没有办法在交互式调试器或访问日志或其他什么东西中看到该字符串? 为了让任何人重现我的精确问题,他们必须拥有我的数据库,这不会发生。然而,由于人们对我正在尝试做的事情的细节表达了兴趣,我发布了以下代码片段:

  OdbcCommand cmd = new OdbcCommand();
  cmd.CommandText = 
     @"insert into Posts (Page, Line, TimeStamp, Status) values
           (@pagename, @lineno, @now, 'SAVED')";
  cmd.Connection = _cn;
  cmd.Transaction = transaction;
  cmd.Parameters.Add(new OdbcParameter("@pagename",OdbcType.VarChar));
  cmd.Parameters.Add(new OdbcParameter("@lineno",OdbcType.VarChar));
  cmd.Parameters.Add(new OdbcParameter("@now",OdbcType.DateTime));
  cmd.Parameters["@pagename"].Value = pageId;
  cmd.Parameters["@lineno"].Value = lineId;
  cmd.Parameters["@now"].Value = now;
  cmd.ExecuteNonQuery();

希望对你有帮助。

再次感谢。

编辑:

我突然想到“TimeStamp”可能是 AccessSQL 中的保留字,这很可能是语法错误的原因。然而,即使假设这是原因,如何查看最终形式的 SQL 查询的一般问题仍然悬而未决。

【问题讨论】:

您也可以在此处发布 SQL...还有一个问题...用于访问的 ADO.NET 提供程序真的使用 SQL 中的参数名称还是仅使用位置参数(即问号?) 令我惊讶的是,TimeStamp 一个保留字:support.microsoft.com/kb/286335 【参考方案1】:

Access 仅使用位置参数。

您需要做的就是将您的 SQL 更改为:

插入帖子(页面、行、[TimeStamp]、状态)值(?、?、?、'SAVED')

确保以正确的顺序将任何其他参数放入Parameters 集合中。

编辑:已更新以解决保留字问题。

编辑: 无法跟踪在 OLE DB 连接上运行的 SQL,至少目前无法跟踪。见this Microsoft KB article。

【讨论】:

这很好用,但不能解决有关查看到达 Access 的 SQL 的主要问题。

以上是关于ADO.NET 中参数化 SQL 命令的最终形式的主要内容,如果未能解决你的问题,请参考以下文章

WangSql 1.0源码共享

如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?

使用 ADO.NET 的 PostgreSQL 参数化插入

ADO.NET链接执行SQL的小白思路

参数化sql查询语句

TDengine 的纯.Net实现的ADO.Net 连接器V3.0.21.74版本发布