2011-11-30 136 views
2

当试图执行代码:这里是什么“缺少SQL属性”?

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属性”。我哪里做错了?
在此先感谢!

回答

5

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

见这个例子: AdoQuery Error using parameters

+0

并将其封装在try/finally块中,因为您的查询对象没有所有者。 –

8

在将SQL设置为rsnome.SQL.Text := ...之前,您正在调用rsnome.Open

+0

参数应与前面“:”为:诺姆。您不需要ExecSql后的post(),您可能需要为要分配的参数值准备查询。 [rsnome.PREPARED = True;]。 –

+1

@Pieter,你根本不需要设置[Prepared](http://docwiki.embarcadero.com/VCL/XE2/en/ADODB.TADOQuery.Prepared)属性。它用于缓存参数值,如果您重复执行具有相同参数值的查询,则不会发生这种情况。用问题查询调用[打开](http://docwiki.embarcadero.com/VCL/en/DB.TDataSet.Open)将失败,并显示空数据集。肯的​​+1 [回答](http://stackoverflow.com/a/8327084/960757)。 – TLama

+0

非常感谢您的帮助,这非常有用。最好的祝福。 –

4

你有几个错误。您在分配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; 
+0

非常感谢您的帮助! –