先写在日志里了,觉得有点意思,拿到这里和大家探讨一下
日志地址: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]);

解决方案 »

  1.   

    memo中有硬回车及换行符,读到字符串中付给sql是不行的,这个和数据库引擎本身环境中执行不一样
      

  2.   


    是的,那些不可见符号我都过滤了,过滤后的SQL语句很干净,放在TOAD里可以执行,放在ADOQuery中只要把分号去掉了也可以运行,这个很奇怪吧bdmh大哥
      

  3.   

    这个有什么奇怪的,数据库的引擎支持分号,ado不支持呗
      

  4.   


    汗,是不是我写得太乱了,我有写到的
    对于一些短的简单的语句如select * from hr_rpt;加不加分号都是对的
      

  5.   


    我反省...帖子写得太乱了不好看
    如果是这样的话为什么我输入这条语句,加了分号,却可以查到正确结果呢??
    select * from hr_rpt;
      

  6.   

    memo中有分号,你读到sql中自然也带着分号,sql不支持分号,你把分号去掉,再读到sql中,当然没问题了
      

  7.   


    晕,大哥们,我来简要说明一下
    如果我要查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里输入这些,加了分号就提示说无效字符,把分号去掉就可以查询到正确结果
      

  8.   

    SuperTitan兄
    多行的话分号在进入Query控件的SQL时也是在结尾处,这个我在单步调的时候跟踪过了的哦
    并没有跑到语句中间而且我都只是执行一条语句,只有一个分号
      

  9.   

    我在TOAD里试验了一下 , 只要;是加在SQL的最后位置,SQL语句再长也是可以识别的啊。。
      

  10.   

    delphi中执行SQL语句时,中间不能有分号.
      

  11.   

    for i to memo1.lines.count
      ...add()
      

  12.   

    对,在TOAD里怎么搞都对...但是我写的小东西是在MEMO里输入SQL语句,然后提交到ADOQUERY的SQL中去执行,长语句加分号就是会提示无法识别的字符
      

  13.   


    我测试了下,逐行读取memo的话#9还是会存在
    去掉了#9后和前边的问题一样,长语句加分号就报无效字符
    短语句加不加分号都可以