由于采用sql拼接方式动态生成sql字符串执行,存在输入项不能含有引号的问题,尝试使用参数方式解决。但是发现输入英文能够顺利保存,但是输入中文后,一直报错。
win7系统,delphi7,mysql odbc 5.5 32位,发现使用传参方式,报错。
//保存验证结果(文字信息)
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中,直接修改字段的编码,记录里面有中文的,保存数据表的时候,同样报上述错误。
偶然发现,把该字段编码设置为gbk,delphi程序段保存竟然不报错了。估计delphi用参数提交方式默认用的是gbk编码。到此问题解决。
最后测试正确的代码,插入、更新都正常,读取显示中文也正常。
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即可。一试,果然如此。
|
请发表评论