在delphi中用TSQLQuery控件向oracle数据库中插数据,其中有一个blob字段,可以为空,写了SQL语句如下:
SQLQuery1.SQL.Text := 'INSERT INTO TestTable (ID,PIC)VALUES(:id, :pic)';
SQLQuery1.parambyname('id').value := '001';
SQLQuery1.parambyname('pic').value := 'EMPTY_BLOB()';
SQLQuery1.ExecSQL(False);
执行时出现:'SQL Server Error: ORA-01465:invalid hex number'的错误是怎么回事?
如果写成下面这样又可以,又可以正常执行
SQLQuery1.SQL.Text := 'INSERT INTO TestTable (ID,PIC)VALUES(:id, EMPTY_BLOB())';
SQLQuery1.parambyname('id').value := '001';
SQLQuery1.ExecSQL(False);
有没有什么方法可以在动态语句中执行插空的BLOB字段?

解决方案 »

  1.   

    你pic变量声明的是什么类型?
      

  2.   

    直接凭sql语句吧
    SQLQuery1.parambyname('pic').value := 'EMPTY_BLOB()';这样写delphi会做些处理
    并不是拼sql 所以是用问题的  
    比如--表示注释
    但是你如果写
    qry.sql.text := 'selcet * from tablename -- 查询 ' 这样也会报错的
      

  3.   

    'EMPTY_BLOB()',这是个什么东西,看似应该是一个方法来获取图像内容吧,你把它当成字符串赋给字段了,估计就是这个问题
      

  4.   

    empty_blob()是关键,我只会DOA的写法,要用到returning子句来返回参数。ADO没试过,从来不用ADO访问ORACLE。
      

  5.   

    EMPTY_BLOB()是oracle的内置函数,是专门用来设置Oracle的blob字段为空的,你这样处理:SQLQuery1.parambyname('pic').value := 'EMPTY_BLOB()'; Oracle会认为你是把字符串'EMPTY_BLOB()'作为二进制处理,而不是认为它是 EMPTY_BLOB(),所以你的第二个方法是对的;总之,你可以对比一下就知道了,把你的参数传递完毕,转化为SQL后你就知道了:第一种方法:'INSERT INTO TestTable (ID,PIC)VALUES('001', 'EMPTY_BLOB()');
    第二种方法:'INSERT INTO TestTable (ID,PIC)VALUES('001', EMPTY_BLOB());显然第二种方法是可以执行的,第一种方法在SQL里'EMPTY_BLOB()'只能作为字符串处理了。
      

  6.   

    谢谢大家的帮助。
    弄明白了,最后找到了方法,方法原来很简单:
    SQLQuery1.parambyname('pic').value := '';
    这样就可以了。