如何使用Tdatabase对象执行SQL语句?//急!!!!!!!!!!!!!!(100分)

  • 主题发起人 主题发起人 onedot
  • 开始时间 开始时间
O

onedot

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI中大家一般都习惯使用TQuery组件的SQL.open()或者SQL.execsql()来执行SQL语句。
但是这种方法有以下不便:
1、首先得必须有TQuery组件,无论是窗体中加或者是数据模块里作个公用的(这种每次使用后必须释放)
2、执行时必须先清空SQL,然后重新赋SQL,太过于麻烦。更关键是对SQL语句执行情况的处理需要使用TRY{}。。。,而且如果使用open()方法还要防止没有返回记录。
而在DELPHI中还有一种方法可以直接控制SQL,就是对TDatabase对象执行EXECUTE()
它的优点是:思路清晰(就是对Tdatabase所指向的数据库操作);操作简洁(执行前后不需要做额外的处理);控制方便(根据操作成功的返回值方便处理)
但现在我遇到问题如下:
如果我使用静态SQL语句,执行没有问题
但是我希望使用动态SQL语句,进行参数传递时,总有“Can't find the object!”错误!,而且不是编译错误,是执行时的错误。不知道是什么原因,哪位大侠请指点!
BOW
//静态代码如下:
Sqlstr:='select * from employee where em_id=''hchen'';
database1.Connected :=true;
err_flg:=database1.execute(Sqlstr,nil,false,nil);
if err_flg=0 then
application.MessageBox ('数据库操作成功!','提示',0)
//动态代码如下:
stmtParams := TParams.Create;{其中stmtParams在窗体里已经定义为Tparams类型变量}
stmtParams.CreateParam(ftString, 'add_id', ptInput);
stmtParams[0].asstring:='hchen';
Sqlstr:='select * from employee where em_id=:add_id';
database1.Connected :=true;
err_flg:=database1.execute(Sqlstr,stmtParams,false,nil);
if err_flg=0 then
application.MessageBox ('数据库操作成功!','提示',0)
 
stmtParams 与 database1的关系?!
 
你可以看DELPHI帮助中,都没有要求stmtParams和database1对象有什么关系的。
帮助中的例子没有声明过,不知道应该如何定义关系?//谢谢!!
 
Database1.Execute(SQLstmt, stmtParams, False, @Cursor);
请加个@Cursor一试
 
没有用的,那个参数不是主要原因。它只是将结果返回给一个句柄而已。
而且我尝试过加了,编译没有问题,但是还是一样错误。
其实它说找不到对象一定是指找不到参数对象吧。但是奇怪是帮助就是这样做的
为什么还是不行?
 
还是没有人知道吗?
 
如果我没猜错的话,你一定用的sql server之类client/server数据库吧,
确实有这个问题,怀疑是BDE bug,你用paradox数据库试验一下,就知道
是成功的 -- 也就是说delphi help的例子并没错,但是不适用于某些数据库。

解决的办法有一个,就是欺骗BDE,把DataBase指向一个local alias,
然后使用 'insert int :remotealias:remotetable values(:p1,:p2)'
之类的sql语句,可以成功。

不过实在不是个好办法 :-(
 
在sql中调用参数的方法不是一个好办法。
其实,完全可以用‘假’静态sql的方式,其实还是静态sql.
如:
aa:='abc';
sqlstr:='select * from employee where em_id='''+aa+'''';
database1.execute(sqlstr,nil,false,nil);
注意:aa 是你自己可以控制的,如从数据库中取,或输入的等等
这样,只要sql语句正确,数据库也支持该sql,则不会出任何问题,不同的数据库也
没有关系。
ok? 问题解决了吗?






 
TO大师:
我提这个问题不过是一起研究探讨DELPHI的一些技术问题,并非说希望通过这个实现
什么目的。如果这样我根本没有必要使用tdatabase的这个方法呀。
我只是奇怪按照帮助上的方法却不能得到期望结果而已。我希望可以知道不行的原因
也希望通过这使大家也可以知道更方便操作数据库的方法。
 
to onedot:竟然没看我的贴子??不是已经说得很明白了吗?

(我最近怎么总碰上这种事??)
 
温柔一刀,你的答案我不是没看到,只是我奇怪如果是你说的原因应该在帮助中有说明的
所以我没有立刻给分。现在看来你说的可能是对的。
//我个人觉得BDE的BUG多如。。。,我总是遇到,:-(
 
多人接受答案了。
 
唉,以后有机会在研究吧! :-)
 
后退
顶部