【问题标题】:SQL Delphi "Parameter 'Subject' not found"SQL Delphi“找不到参数'主题'”
【发布时间】:2015-01-23 17:14:20
【问题描述】:

我最近开始学习如何在 Delphi 中编写代码,因为我从 Python 转到了一个项目。我似乎无法找到解决此问题的方法。我现在已经在网上搜索了几个小时,但似乎没有一个“修复”有效。我尝试过使用“Query.ExecSQL”,尝试将代码分解为段,尝试将 edtSubject.Text 分配给变量并以这种方式执行,以及其他一些尚未修复的“解决方案”问题。我真的在为此苦苦挣扎,需要一种快速修复它的方法,这是我的代码:

Query := TADOQuery.Create(Self);
Query.Connection := ADOConnection;
Query.SQL.Add('INSERT INTO tbl_RFI (Subject) VALUES (:Subject)');
Query.Parameters.ParamByName('Subject').Value := edtSubject.Text;
Query.ExecSQL;

我真的希望有人可以帮助我, 谢谢。

【问题讨论】:

  • 第二次尝试使用 TADOCommand,因为您没有返回任何数据,TADOQuery 对您从该查询中获取结果没有任何帮助。
  • 如果我没记错的话,我遇到的一个问题是通过在参数名称中使用所有小写字母来解决的。
  • 好点。已删除。
  • 我们说的是什么delphi版本?您使用的是什么数据库/ODBC 提供程序?
  • 我刚刚进行了快速测试,它对我来说很好;唯一的区别是我将 ADOQuery 放到了表单上并手动设置了ConnectionString,所以我不需要前两行代码,我使用了Query.SQL.Text 而不是Add。您使用的是什么 DBMS?

标签: sql delphi parameters project


【解决方案1】:

只需在设置 SQl Text 之前添加 Query.ParamCheck := true 就可以了

【讨论】:

  • 这对我有帮助。看起来我不小心把那个选项变成了 false..
【解决方案2】:

尽管其他人说我多年来在我的生产代码中不时发生同样的事情。

未找到参数“ParameterName”

始终使用在代码中创建的 ADO 对象。我找到的最好的解决方法是在这里http://edn.embarcadero.com/article/20420

基本上只是强制 ADO 对象在您引用它们之前重新解析参数。

编辑:感谢 Ken 的反馈,我在调用 ParseSQL 之前首先添加了一个测试以检查参数是否存在,从而在 99.9% 的时间内保留执行计划。

with TADODataSet.Create(nil) do
try
  Connection := MyADOConnection;
  CommandText := 'SELECT Foo ' +
    'FROM FooBar ' +
    'WHERE Bar = :Bar ';
  if Parameters.FindParam('Bar') = nil then
    Parameters.ParseSQL(CommandText, True); {<- THIS IS THE FIX }
  Parameters.ParamByName('Bar').Value := 'value';
  Open;
finally
  Free;
end;

自从添加 ParseSQL 后,我就没有遇到问题了。

【讨论】:

  • 这是错误的。它破坏了在循环中运行的代码,如果除了参数值没有任何变化,您需要服务器重用已编译 SQL 的性能。将您的插入插入到插入多行数据和时间差异的紧密循环中。除了少数行之外,它对所有行都很重要,因为在每次传递时重新解析会导致服务器丢弃缓存的已编译 SQL 并重做它。自从 v1 发布以来,我一直在用 Delphi 编写与数据库相关的代码,经常使用 ADO,并且从来不需要使用像你这样的代码。
  • 恕我直言@KenWhite,我不认为我们在说同样的话。我有 SELECT 查询,例如此示例中的简单查询(无循环),偶尔会返回所描述的错误。我正在设置命令文本,然后设置参数值,但错误提示参数不存在。它会在 99.9% 的时间内工作,但我确实得到了错误。添加 ParseSQL 即可解决。
  • 不,我们说的不是同一件事。 添加 ParseSQL 是完全错误的。如果您遇到该错误,则说明您遇到了其他问题,并且您通过丢弃已编译的 SQL 而不是修复根本问题来隐藏它。我的最后一条评论准确地解释了为什么它是错误的。您正在扼杀 99.9% 的代码的性能,以(错误地)处理 0.1% 的问题。恕我直言,您应该更仔细地阅读我写的内容。
【解决方案3】:

我知道回复晚了,但我刚刚经历了同样的情况,所以以防万一这对其他人有帮助。它是随机发生的,在我的例子中是一个 tadocommand,“找不到参数”。程序出错,重新启动执行完全相同的事件序列并且工作正常。加载编译器,逐步执行并正常工作。设置断点,可以看到参数没有定义。但同样,也不是每次,都是随机的。

所以感觉像是某种时间问题。我尝试了 ParseSQL 命令,实际上每次都会出现不同的错误。我认为命令文本被裁剪但没有对此进行调查。 (这是一个相当长的命令)

无论如何,在创建 tadocommand 并分配 sql 文本后,我似乎能够通过添加 application.processmessages 来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多