Delphi中ADOQuery控件中SQL碰到长语句就不能加分号了?
先写在日志里了,觉得有点意思,拿到这里和大家探讨一下
日志地址:http://lasombra.javaeye.com/blog/444845
版本是Delphi6,连接数据库ORACLE,使用ADOConnection,ADOQuery
情况是这样的,我写的一个小软件中有个MEMO控件是供用户输入SQL语句的,输入的SQL语句直接提交到ADOQuery控件的SQL中然后提交
在测试的时候,我写了一条短语句,加不加分号都是可以的,比如
select * from hr_rpt; --hr_rpt是一张表
可是,当我从一个记事本中摘了一段SQL语句贴到MEMO上点提交的时候,错误出现了
ORA提示,无效字符,怎么会?
在TOAD里测试了一下记事本中的SQL语句,正确。在Delphi里单步调,ctrl+F5跟踪memo.lines.text,发现多了很多'#$D#$A'和'#$D#$A#9',查了一下是制表符之类的,于是写了两条语句过滤掉这些东西
strTmp := mmoSqlInput.Lines.Text;
strTmp := StringReplace(strTmp,#13#10,' ',[rfReplaceAll]);
strTmp := StringReplace(strTmp,#9,'',[rfReplaceAll]);
再跟,这回SQL看起来对了,再运行,还是无效字符,搞什么?
将watch window里进过过滤的strTmp语句拿出来(Ctrl+I调出Inspector,取值)放到TOAD里运行,对的啊,怎么回事?
在memo上粘贴了出问题的SQL语句后,去掉最后的分号,这回执行通过了,返回结果,分号的问题吗?SQL语句长一点,复杂一点,就不能加分号了?
很郁闷的问题啊!怎么回事。
我现在的解决方法是再加一条StringReplace语句
strTmp := StringReplace(strTmp,';','',[rfReplaceAll]);
[解决办法]
memo中有硬回车及换行符,读到字符串中付给sql是不行的,这个和数据库引擎本身环境中执行不一样
[解决办法]
最后的分号是没有事的,也就是说你只有一行语句的时候,最后有分号没有事情
但是如果有多行,那分号就放到语句中间了,肯定会出问题
[解决办法]
我在TOAD里试验了一下 , 只要;是加在SQL的最后位置,SQL语句再长也是可以识别的啊。。
[解决办法]
for i to memo1.lines.count
...add()