【问题标题】:What are the "Missing SQL property" here?这里的“缺少 SQL 属性”是什么?
【发布时间】:2011-11-30 12:43:48
【问题描述】:

尝试执行代码时:

function TDBClass.addNome(nome: String): String;
var
  rsnome: TADOQuery;
begin
  rsnome := TADOQuery.Create(nil);
  rsnome.Connection := connection;
  rsnome.Open();
  rsnome.SQL.Clear;
  rsnome.SQL.Text:='UPDATE enroll SET nome = "test" where id ="1"';
  rsnome.Parameters.ParamByName('nome').Value:= nome;
  rsnome.ExecSQL;
  rsnome.post();
  rsnome.Close();
  rsnome.Free();
end;

我收到错误消息“缺少 SQL 属性”。我哪里做错了?
提前致谢!

【问题讨论】:

    标签: delphi tadoquery


    【解决方案1】:

    您在通过rsnome.SQL.Text := ... 设置SQL 之前调用rsnome.Open

    【讨论】:

    • 参数前面应该有一个':',如:NOME。您不需要在 ExecSql 之后使用 post(),并且您可能必须为要分配的参数值准备查询。 [rsnome.PREPARED = True;].
    • @Pieter,您根本不需要设置 Prepared 属性。如果您重复执行具有相同参数值的查询,则它用于缓存参数值,而不是这种情况。并且使用来自问题的查询调用 Open 将失败并显示空数据集。 +1 为 Ken 的answer
    【解决方案2】:

    我认为你根本不想使用 Open,而且你使用的参数不正确。
    即 SQL 中没有任何 :PARAM 占位符。我认为应该是这样的:rsnome.SQL.Text:='UPDATE enroll SET nome = :NOME where id = :ID';

    看这个例子: AdoQuery Error using parameters

    【讨论】:

    • 并将其封装在 try/finally 块中,因为您的查询对象没有所有者。
    【解决方案3】:

    您有几个错误。您在分配 SQL 之前调用了Open(并且不需要这样做)。

    您正在尝试设置一个尚未创建要接受的参数的参数值。 (顺便说一句,我也将 ID 设为参数,因此您可以使用它来更新多个人的姓名。)

    你没有确保事情得到清理以防出现错误(鉴于你发布的代码肯定会出现错误)。

    您正在使用Post,这对于 SQL 数据库来说不是必需的。

    试试这样的方法:

    function TDBClass.addNome(nome: String): String;
    var
      rsnome: TADOQuery;
    begin
      rsnome := TADOQuery.Create(nil);
      try
        rsnome.Connection := connection;
        rsnome.SQL.Clear;
        rsnome.SQL.Text:='UPDATE enroll SET nome = :nome where id ="1"';
        rsnome.Parameters.ParamByName('nome').Value:= nome;
        rsnome.ExecSQL;
        rsnome.Close();
      finally
        rsnome.Free();
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2010-12-24
      • 2012-11-21
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多