最近由delphi7 升级到 delphi10 ,某个项目升级后数据库写库出现中文乱码问题,未找到解决办法。编译环境:Delphi 10 seattle 数据库: oracle 11g问题现象: FDQuery1.Close;
FDQuery1.SQL.Clear ;
FDQuery1.SQL.Text:='INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(''CHN'',''张三'',''19920501'',''1'')‘;
FDQuery1.ExecSQL; 这种写法数据库里 ’XM‘ 字段数据里显示是’??‘ 乱码。 FDQuery1.Close;
FDQuery1.SQL.Clear ;
FDQuery1.SQL.Text:='INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(:vGJDQ,:vXM,:vCSRQ,:vXB)‘;
FDQuery1.Params.ParamByName('vGJDQ').Value :='CHN';
FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
FDQuery1.Params.ParamByName('vXB').Value :='1';
FDQuery1.ExecSQL; 这种写法数据库里 ’XM‘ 字段 显示正常-’张三‘。
说明: 原项目是用的第一种写法,给后面整个 value()里的值做为一个 string 参数 传进来写库,字段较多,转换成第二种写法较麻烦,第二个就是不明白这两种写法有什么区别,为什么会乱码,想知道原因,劳烦各路神仙,在此叩谢!!!
FDQuery1.SQL.Clear ;
FDQuery1.SQL.Text:='INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(''CHN'',''张三'',''19920501'',''1'')‘;
FDQuery1.ExecSQL; 这种写法数据库里 ’XM‘ 字段数据里显示是’??‘ 乱码。 FDQuery1.Close;
FDQuery1.SQL.Clear ;
FDQuery1.SQL.Text:='INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(:vGJDQ,:vXM,:vCSRQ,:vXB)‘;
FDQuery1.Params.ParamByName('vGJDQ').Value :='CHN';
FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
FDQuery1.Params.ParamByName('vXB').Value :='1';
FDQuery1.ExecSQL; 这种写法数据库里 ’XM‘ 字段 显示正常-’张三‘。
说明: 原项目是用的第一种写法,给后面整个 value()里的值做为一个 string 参数 传进来写库,字段较多,转换成第二种写法较麻烦,第二个就是不明白这两种写法有什么区别,为什么会乱码,想知道原因,劳烦各路神仙,在此叩谢!!!
可参考以下下面的连接:https://wenku.baidu.com/view/bceef569e97101f69e3143323968011ca200f748.html?re=viewhttp://www.it610.com/article/4656104.htm
FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
FDQuery1.Params.ParamByName('vXB').Value :='1';
这些Value在服务器中未必识别为String
可能生成如下SQL代码:INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(CHN,郭龙生,19920501,1)而'INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(''CHN'',''张三'',''19920501'',''1'')‘;这一句的,肯定是字符串
你的第二种方式竟然能执行通过???
我觉得乌龟壳的语法也不是很严谨
FDQuery1.Params.ParamByName('vXM').Value :='郭龙生';
FDQuery1.Params.ParamByName('vCSRQ').Value :='19920501';
FDQuery1.Params.ParamByName('vXB').Value :='1';正确的写法应该是:
FDQuery1.Params.ParamByName('vGJDQ').Value :=QuotedStr('CHN');
FDQuery1.Params.ParamByName('vXM').Value :=QuotedStr('郭龙生');
FDQuery1.Params.ParamByName('vCSRQ').Value :=QuotedStr('19920501');
FDQuery1.Params.ParamByName('vXB').Value :=QuotedStr('1');
dm1.FDQ1.ParamByName('业务量折算得分').Value := LabeledEdit4.Text;
dm1.FDQ1.ParamByName('工资编号').Value := Edit5.Text;
这样写应该问题不大吧,我的是sql server
你加了params会报错?你用的不是FDQuery这个组件吧
SQL没测试过,应该不会乱码,就是Oracle 乱码。
FDQuery1.SQL.Text:=Format('INSERT INTO T_SBXX (GJDQ,XM,CSRQ,XB) VALUES(%s , %s , %s , %s)',
[QuotedStr('CHN'),QuotedStr('张三'),QuotedStr('19920501'),QuotedStr('1')]);
在N年前,Borland就有文章说过,尽量用参数化SQL,不要自己拼接SQL串,直接写在SQL中的字符型字段值其编码可能与DMBS对它的理解不一致
qry_update.ParamByName('vxm').Value :=Trim(EXM.Text);