有关TQuery的问题(100分)

  • 主题发起人 主题发起人 plwei
  • 开始时间 开始时间
P

plwei

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的程序中有如下的代码:
var
ss:string;
with query1 do
begin

close;
sql.clear;
sql.add('update inforbase.db set account=300
where name1=:name1');
parambyname('name1').asstring:=ss;
try
execSQL;
except
open;
end;
active:=false;
active:=true;
end;
在程序运行到active:=true时出现“Error Creating Cursor handle”的错误不知为什么?
如果将active:=false;active:=true去掉则Dbgrid就不能显示数据了。
请指出错误。
再一个问题就是:
如果我想将上面的SQL语句中的set account=300,使account等于一个变量我应该怎么办?
开始我是这样做的set account=:account; 再用
query1.parambyname('account').asinteger:=sub //sub为一变量.
这样做不行,请各位高手告之正确的方法。


 

update inforbase.db set account=300
where name1=:name1';

只能使用execSQL的方法,

Active := true ;这个过程实际上使用的是Tquery.open,

所以当然出错. 因为它需要有数据集返回.

第二个问题: 报的什么错误? 原本应该可以的.
 
有数据集返回时用open或active:=true;
在没有数据集返回时必须用exesql;
另外在SQL中用参数容易出问题,我一直是这样用:
query1.sql.clear;
query1.sql.add('select * from 表 where 表.tablename='+edit1.text);
query1.active:=true;
其中edit1.text为参数

 
1。你应该在UPDATE后在重新改回SELECT,再OPEN。
2。说说错误信息
 
100% runable under sqlserver6.x

var
ss:string;
with query1 do
begin

close;
sql.clear;
// sql.add('update inforbase.db set account=300 where name1=:name1');
sql.add('update inforbase.db set account=' + inttostr(sub) + ' where name1=''' + ss + '''');
try
execSQL;
except
open;
end;
active:=false;
active:=true;
end;
 
第一个问题nickname点到了实质。
第二个问题的错误提示是:type mismatch
 
非也非也。
1 open确实是错误的,但不是实质,如果try 能过,即execsql正确的话,根本
不执行OPEN语句,何来错误。。。
2 type mismatch是因为NAME1不是数字或逻辑型,应当加引号即:
+ ' where name1=''' + ss + '''');
否则会出现" where name1=test"的语句而不是" where name1='test'"

另外,我的程序没有通过吗?!?!?!
 
1.这位老兄是先用QUERY1做修改记录,在用同一个QUERY1做查询,所以先
UPDATE--EXECSQL,再改成SELECT--OPEN。
2.你把asinteger--->asfloat.
 
account 在数据库中的类型是什么? , 你的类型匹配一定有问题.
 
1.
要保存原来的SQL Clause:
Var ss,OldSqLText : String;

With Query1 do
Begin
Close;
OLdSQLText := SQL.Text;
SQL.Clear;
try
SQL.Add('Update Inforbase.db set account = 300 where name1 =
"' + ss + '"');
ExecSQL;
finally
SQL.Clear;
SQL.Text := OldSqlText;
Open;
end;
End;
2. 请查参数类型的设置(Out,In...)
 
接受答案了。
 
Open或Active:=True;
只适合于Select语句
其他的如:Delete,Update等等,只能用ExecSql打开。

因为你使用了Update,所以用Open当然出错了。
在Update后,再改写sql,如Query1.Sql.Text:='Select * from Tabel1';
这样就可以open了.
 
只有返回结果集的SQL语句才能用Open
不返回结果集的SQL语句不能用Open,只能用ExecSQL
 
接受答案了。
 
xixi,plwei,你老写“接受答案了。”干吗?
 
难道我的分没有给大家加上吗?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部