先请看下面的代码:     With ADOQuery Do
     Begin
          With SQL Do
          Begin
               Add('Insert Into IntraUsers');
               Add('        UserName,');
               Add('        EmailAddress,');
               Add('Values');
               Add('      (:UserName,');
               Add('       :EmailAddress)');
          End;          Parameters.ParamByName('UserName').Value := UserNameText;
          Parameters.ParamByName('EmailAddress').Value := EmailAddressText;          ExecSQL;
     End;没有错吧?使用的数据库是Access 2000,UserName和EmailAddress字段定义均为文本,不是必填,也允许为空。当变量UserNameText和EmailAddressText不是空字符串的时候,上述代码执行正常;可问题是,当UserNameText和EmailAddressText这两个变量中有任何一个为''(空字符串),就会在ExecSQL的时候抛出一个莫名其妙的异常,我猜它是说参数类型的问题。呃……哪位大虾给个解决方案?在此先拜谢了!

解决方案 »

  1.   

    少写了对括号,你对照以下检查一下你的sqlinsert into 表(字段1,字段2....) values(数据1,数据2....);
      

  2.   

    sql语句不对
    sqlquery:='insert into intrausers(username,emailaddress) 
    values(:username,:emailaddress)'+
    adoquery1.sql.add(sqlquery);
    这样试试
      

  3.   

    With ADOQuery1 Do
         Begin
              With SQL Do
              Begin
                   Add('Insert Into IntraUsers(UserName,EmailAddress)');
                   Add('Values(:UserNam,:EmailAddres)');
              End;
              Parameters.ParamValues['UserName'] := UserNameText;
              Parameters.ParamValues['EmailAddress'] := EmailAddressText;
              execsql;
         End;改为用paramvaluesparamvalues是variant型,而parambyname.value是olevariant型,olevariant好象对''的支持有问题
      

  4.   

    Sorry,前面贴错了,因该是     With ADOQuery Do
         Begin
              With SQL Do
              Begin
                   Add('Insert Into IntraUsers');
                   Add('        (UserName,');
                   Add('        EmailAddress)');
                   Add('Values');
                   Add('      (:UserName,');
                   Add('       :EmailAddress)');
              End;          Parameters.ParamByName('UserName').Value := UserNameText;
              Parameters.ParamByName('EmailAddress').Value := EmailAddressText;          ExecSQL;
         End;哦?用ParamValues就可以了?
      

  5.   

    老大,试过了,ParamValues还是不行。
      

  6.   

    奇怪了,我也试过了,确实不行。难道和Access 2000有关?
      

  7.   

    不是啊,当然不是非空啦,我用Access自己添了一条纪录,两个都是空字符串,一点问题也没有啊?!
      

  8.   

    我用paramvalues测试oracle数据库是没有问题的。再不行,你也别用variant了,直接转换一下类型,如下params[0].AsString := UserNameText;
    params[1].AsString := EmailAddressText;
      

  9.   

    Value是OleVariant变量,将''给它时Value的类型被设置为NULL,也就是无类型,对于无类型的变体,Delphi无法确定其缺省值,当然就不知道如何处理
      

  10.   

    lws0472:大哥,ADOQuery下面没有Params[...]啊?那是BDE下面的吧?
      

  11.   

    budi() 已经讲的很清楚了。bde的参数可以直接转换类型,所以没有问题。
    variant和''的转换是没有问题的
    我也用paramvalues按你相同的情况测试了,没有问题,强烈建议你再做一遍试试
      

  12.   

    呃……不好意思,可能我没有讲清楚,我用的是ADO访问,不用BDE,因为项目不允许。我在BDE下面也从来没有问题,就是ADOQuery用的不是TParam而是TParameter,而且TParameter只有.Value而没有.AsXXX,才会出这种问题。所以还请大哥见谅,帮忙看看用ADO连接Access 2000怎么处理这个问题,谢谢!
      

  13.   

    还有,我跟踪到ADOQuery的内部,发现.Value被赋值为''的时候,类型并不是ftUnknown或者ftNull,确实是ftString,只是Size是-1,实在是不明白,还请大哥帮忙解释一下,谢谢!
      

  14.   

    Parameters.ParamValues['UserName'] := UserNameText;
    是ado的写法,我是用ado测试的,配的跟你的环境一模一样。我用parambyname时有异常发生,而用paramvalues时就没有问题。