先写在日志里了,觉得有点意思,拿到这里和大家探讨一下
日志地址: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]);
日志地址: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]);
解决方案 »
- 主界面showmodal事件中开了一个线程,退出时出错;求助
- 高分求解:delphi如何使用C写的sdk???
- Delphi 数据库相关开发的牛人或星星关前来报个到, 认识一下方面的留下QQ号或群号.
- 编译环境问题?请进
- 救命,倒库 高分
- 郁闷,还是单身!
- 谢谢了!!!
- 请教:线程对象可不可以封装在DLL里? 是不是也要象在DLL里封装一个类似的,还要用很多函数导出它的方法和属性??
- 在TStringGrid想使用指定的Color来填充Cell,为什么用Canvas.Rectangle或Canvas.FillRect都不行
- 麻烦那位朋友帮我找一个函数!!(我已经第三次提问了)
- 求32*32点阵字库
- toolbar最右边放个combobox,程序运行时却走到早间?
是的,那些不可见符号我都过滤了,过滤后的SQL语句很干净,放在TOAD里可以执行,放在ADOQuery中只要把分号去掉了也可以运行,这个很奇怪吧bdmh大哥
汗,是不是我写得太乱了,我有写到的
对于一些短的简单的语句如select * from hr_rpt;加不加分号都是对的
我反省...帖子写得太乱了不好看
如果是这样的话为什么我输入这条语句,加了分号,却可以查到正确结果呢??
select * from hr_rpt;
晕,大哥们,我来简要说明一下
如果我要查hr_rpt表中所有内容,在memo里输入
select * from hr_rpt 或者句末加个分号 select * from hr_rpt;
这两种情况都是可以执行的但是如果我查询的条件复杂点,让语句变得很长,比如
SELECT HI_USER.C_USERNAME ,HI_GRIGHT.C_RIGHTCODE, HI_RIGHT.C_CLASS, HI_RIGHT.C_RIGHTNAME
FROM HI_GIGHT, HI_USERG, HI_USER, HI_RIGHT
WHERE HI_GRIGHT.C_FLAG = '0'
AND HI_GRIGHT.L_GROUPID = HI_USERG.L_GROUPID
AND HI_USERG.L_USERID = HI_USER.L_USERID
AND HI_GRIGHT.C_RIGHTCODE = HI_RIGHT.C_RIGHTCODE
AND HI_USER.L_USERID = 1
这种语句,那如果在memo里输入这些,加了分号就提示说无效字符,把分号去掉就可以查询到正确结果
多行的话分号在进入Query控件的SQL时也是在结尾处,这个我在单步调的时候跟踪过了的哦
并没有跑到语句中间而且我都只是执行一条语句,只有一个分号
...add()
我测试了下,逐行读取memo的话#9还是会存在
去掉了#9后和前边的问题一样,长语句加分号就报无效字符
短语句加不加分号都可以