delphi adocommand adoquery 插入、更新sql 中文传参方式,报错incorrect string value

由于采用sql拼接方式动态生成sql字符串执行,存在输入项不能含有引号的问题,尝试使用参数方式解决。但是发现输入英文能够顺利保存,但是输入中文后,一直报错。

win7系统,delphi7,mysql odbc 5.5  32位,发现使用传参方式,报错。

delphi adocommand adoquery 插入、更新sql 中文传参方式,报错incorrect string value_第1张图片

    //保存验证结果(文字信息)
    cmd1.CommandText:='insert into cw_bxd_valid (systime,bx_id,validresult) values (now(),:bxd_code,:validresult) ';
    cmd1.Parameters.ParamValues['bxd_code']:='123456';
    cmd1.Parameters.ParamValues['validresult']:=memo_valid.Lines.Text;

    cmd1.Execute;

 

    cmd1.CommandText:='insert into cw_bxd_valid (systime,bx_id,validresult) values (now(),:bxd_code,:validresult) ';
    cmd1.Parameters.Clear;
    cmd1.Parameters.CreateParameter('bxd_code',ftString,pdInput,Length(bxd_code),bxd_code);
    cmd1.Parameters.CreateParameter('bxd_code',ftString,pdInput,Length(memo_valid.Lines.Text),memo_valid.Lines.Text);

//    cmd1.Parameters.ParamValues['bxd_code']:='123456';
//    cmd1.Parameters.ParamValues['validresult']:=memo_valid.Lines.Text;
    cmd1.Execute;

 

后来发现,在navicat中,直接修改字段的编码,记录里面有中文的,保存数据表的时候,同样报上述错误。

delphi adocommand adoquery 插入、更新sql 中文传参方式,报错incorrect string value_第2张图片

偶然发现,把该字段编码设置为gbk,delphi程序段保存竟然不报错了。估计delphi用参数提交方式默认用的是gbk编码。到此问题解决。

delphi adocommand adoquery 插入、更新sql 中文传参方式,报错incorrect string value_第3张图片

   最后测试正确的代码,插入、更新都正常,读取显示中文也正常。

    qry1.Active:=false;
    qry1.SQL.Text:='select * from cw_bxd_valid where bx_id='''+bxd_code+'''';
    qry1.Active:=true;
    if qry1.RecordCount>0 then
    begin
        cmd1.CommandText:='update cw_bxd_valid set systime=now(),validresult=:validresult where bx_id=:bxd_code';
        cmd1.Parameters.ParamValues['bxd_code']:=bxd_code;
        cmd1.Parameters.ParamValues['validresult']:=memo_valid.Lines.Text;
        cmd1.Execute;
    end
    else
    begin
        cmd1.CommandText:='insert into cw_bxd_valid (systime,bx_id,validresult) values (now(),:bxd_code,:validresult) ';
        cmd1.Parameters.Clear;
        cmd1.Parameters.CreateParameter('bxd_code',ftString,pdInput,Length(bxd_code),bxd_code);
        cmd1.Parameters.CreateParameter('bxd_code',ftString,pdInput,Length(memo_valid.Lines.Text),memo_valid.Lines.Text);
    //    cmd1.Parameters.ParamValues['bxd_code']:='123456';
    //    cmd1.Parameters.ParamValues['validresult']:=memo_valid.Lines.Text;
        cmd1.Execute;    
    end;

 

 

到笔记本上运行,发现报错,示“不正常地定义参数对象”,“提供了不一致或不完整的信息”错误,但是不影响实际插入更新效果。按照网上的设置paramcheck也不行,连参数都不检测了。没时间考虑,最后加try except end;临时先用着。编译后,运行是不会报错的,只有在源程序运行模式下报错。

 

Delphi执行SQL提示“不正常地定义参数对象”,“提供了不一致或不完整的信息”错误

2011年09月02日 15:09:08 zhongguoren666 阅读数 4312 标签: delphisqlgoogle脚本更多

个人分类: Delphi

 用AdoQuery从脚本文件读入内容,执行时提示“不正常地定义参数对象”,“提供了不一致或不完整的信息”之类的错误,本以为是SQL语句有问题,用查询分析器执行时没有发现错误,一切OK。但一到Delphi中执行就提示“不正常地定义参数对象”,“提供了不一致或不完整的信息”。用Google对关键字进行检索,发现有提示,说是由于TADOQuery对象把":"后的字符当作变量来使用,导致数据识别错误。只要把 TADOQuery.ParamCheck设置为False即可。一试,果然如此。

你可能感兴趣的:(delphi)