怎样通过Tquery控件实现带参数(params)操作ORACLE(100分)

  • 主题发起人 主题发起人 liuyj
  • 开始时间 开始时间
L

liuyj

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI中用TQUERY操作ORACLE,直接用语句执行正常(不带参数),如果带参数(用
params)就会报错,系统提示错误为:opration not applicable,这是怎么回事?
 
代码能贴出来吗?
 
我有一个表名字为course,表中有字段cno,cname,都是字符串。代码如下:
query2.sql.text:='insert into course (cno,cname) values(''1011'',''zzx'')'
上面这句执行正确。
query2.sql.text:='insert into course (cno,cname) values(:c1,:c2)'
query2.params[0].asstring:='2000';
query2.params[1].asstring:='xxxx';
query2.execsql;
这样写执行就出错

 
1.原理上是没错的,因为参数的传递是由delphi来编译执行的,发给后台的
应该是一条确定的不带参数的insert语句,跟踪一下sql的执行,看看生成的语句?
2.换一下试试?
query2.parambyname('c1').asstring:='2000';
query2.parambyname('c2').asstring:='xxxx';
query2.prepare;//是不是一定要加这句?
query2.execsql;
 
预先在 Params 中选择参数的类型
 
你query2.params[0].asstring:='2000';中的数据类型对吗?
你可以单步执行,然后看到底是那句错了
 
我数据库中定义的字段类型为varchar,运行其他语句都没错,执行query2.execsql时出错。
sonie说的增加prepare方法也不行。
 
如果参数类型正确应该没问题。
 
问题到底出在什么地方,用跟踪怎么能看到参数赋值后的SQL串?如果用table的append、
post方法,可以增加记录,是tquery的问题还是我程序问题?
 
Tquery跟Oracel的结合有一定问题,特别是当Tquery的sql语句中引用了Oracle的函数以后,
那么它返回的结果集只能是只读,如果选择了requestlive=true,会出现跟你所说的同样的
错误,我只能认为这是Borland公司跟Oracle公司之间的问题
 
那就是说,要和ORACLE连接,不能用TQUERY了?今天我尝试用ADOQUERY操作,可以正确操作
ORACLE。ADOQUERY和Tquery区别在那里,能讲解以下吗?
 
以下代码是我在以前程序中用过的(修改了一下字段和表名),保证没问题的。
其中key是blob类型的,关键是要先对param设datatype,否则缺省是variant类型的。

sqlstr:='insert into Tablename (key) values (:deskey)';
qrySubmit.Close;
qrySubmit.SQL.clear;
qrySubmit.SQL.add(sqlStr);
qrySubmit.ParamByName('deskey').datatype:=ftBlob;
qrySubmit.ParamByName('deskey').setBlobdata(p, keylen);
// qrySubmit.prepare;
qrySubmit.ExecSQL;
strdispose(p);

此外,prepare并不是必须的,只是用耗资源省时间的做法罢了。
 
参数类型设置了,还是不行,怎么回事?如果类型不同,会提示类型不支持。
 
确认参数类型的设置
 
没玩过oracle完成只是猜测,不当之处请原谅
1.我想说一句的就是如果他用到了AsString,AsInteger等函数的话,就等于已指定类型为string
或integer,不定再显示的用datatype去指定了。就有用value时再要指定。
2.原语句原理上没错,一条条语句的跟踪不会有结果,只有到open时才会出错.
3.参数的分配是由delphi来完成的,所以你用SQL Monitor跟踪一下看生成的SQL语句有没有问题,
是不是ORACLE支持的语句.比如说我注意到你的静态语句是...values(''1011'',''zzx''),而
参数是='1011'和'zzzz',是不是改成''1011''和''zzzz''试一下(也就是说oracle要字符串带'')
 
我认为这不是TQuery和oracel结合的问题。因为我使用tquery对oracel进行插入操作,
并没有出现什么问题。改成''1011''是不对的,AsString已经告诉Tquery接受的参数
将是一个字符串。
你试一试在query2.sql.add(...)之前,加入:
query2.close;
query2.sql.clear.
看看行不行。
我看你用的是query2.sql.text:=...;我没有这样使用的经历。
一般都是用query2.sql.add()过程。
 
1. "sql.text"这种写法不太好,最好用"sql.add"
2. 你可以用Format函数拼一条带参数的SQL语句
 
sql.text的用法没问题
 
用Format函数拼一条带参数的SQL语句,用text或者add方法都可以,这个问题解决了。
很感谢大家的帮忙。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
799
import
I
后退
顶部