BCB通过ADO往MYSQL插入中文字符报错

时间:2021-07-21 07:37:29
今日一个小工具,采用的是bcb6和mysql,用的是ADO进行连接数据库的,
connstr=Provider=MSDASQL.1;Persist Security Info=False;Data Source=db;
在  q1->ExecSQL();进行insert into 插库的时候,提示报错,报错为
[MySQL][ODBC 5.1 Driver][mysqld-5.1.26-rc-community]Incorrect string value: '\xB5\xA5\xC1\xA3.t...' for column 'ftpfile' at row 1
在CSDN上面查找了,说是中文的问题,想请教一下有没有什么办法能够解决这个问题的啊。感谢

15 个解决方案

#1


给地自己顶起来,期待高手的解决

#2


跟踪一下程序,看下你的sql语气有没有问题,介意直接发源代码

#3


你检查插入的数据库字段的charset是不是utf8或是中文类型,如果不是,就会出错

#4


q1->SQL->Clear();
         q1->SQL->Add("insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8)");

         AnsiString filename =StrPas(fds[1].c_str());
         Log->Lines->Add("filename:"+filename);

         q1->Parameters->ParamByName("v1")->Value=filename;
         String cmpno=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v2")->Value=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v3")->Value=StrPas(fds[3].c_str());
         TDateTime now=Now();
         q1->Parameters->ParamByName("v4")->Value= FormatDateTime("yyyy-mm-dd hh:nn:ss",now);
         String taskno=cmpno+FormatDateTime("mmddhhnnss",now);
         q1->Parameters->ParamByName("v5")->Value=taskno;
         q1->Parameters->ParamByName("v6")->Value=StrPas(fds[4].c_str());
         q1->Parameters->ParamByName("v7")->Value=StrPas(fds[5].c_str());
         q1->Parameters->ParamByName("v8")->Value=StrPas(fds[6].c_str());

         q1->ExecSQL();

#5


引用 3 楼 scoredhigh 的回复:
你检查插入的数据库字段的charset是不是utf8或是中文类型,如果不是,就会出错


数据库字段使用的gb2312,如果把数据库字段改成utf8的话,BCB小程序不会报错,但是数据库表里面显示的却是乱码。

#6


引用 4 楼 znit2003 的回复:
q1->SQL->Clear();
         q1->SQL->Add("insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8)");

         AnsiString filename =StrPas(fds[1].c_str());
         Log->Lines->Add("filename:"+filename);

         q1->Parameters->ParamByName("v1")->Value=filename;
         String cmpno=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v2")->Value=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v3")->Value=StrPas(fds[3].c_str());
         TDateTime now=Now();
         q1->Parameters->ParamByName("v4")->Value= FormatDateTime("yyyy-mm-dd hh:nn:ss",now);
         String taskno=cmpno+FormatDateTime("mmddhhnnss",now);
         q1->Parameters->ParamByName("v5")->Value=taskno;
         q1->Parameters->ParamByName("v6")->Value=StrPas(fds[4].c_str());
         q1->Parameters->ParamByName("v7")->Value=StrPas(fds[5].c_str());
         q1->Parameters->ParamByName("v8")->Value=StrPas(fds[6].c_str());

         q1->ExecSQL();
我大概知道了,你用的是参数,我以前遇到过,不要使用参数,使用参数中文时多半会报错

#7


AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);
q1->ExecSQL(); 

类似这种形式比较好

#8


把服务器和客户端的字符集改成一样的看看

#9


自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。

#10


引用 9 楼 cptang 的回复:
自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。
 这个办法我试过了,不行的哟。

#11


引用 10 楼 znit2003 的回复:
Quote: 引用 9 楼 cptang 的回复:

自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。
 这个办法我试过了,不行的哟。
用我说的那种方法,百分之百可以啊。
如果非要用参数的话,对应的字段赋值要加上转换函数,例如
q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);类似这样试试

#12





引用 7 楼 scoredhigh 的回复:
AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 

#13


引用 12 楼 znit2003 的回复:
Quote: 引用 7 楼 scoredhigh 的回复:

AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 
我以前试过,应该是可以的。 
你确认一下是否凡是有可能有中文的字段都使用了AnsiToUtf8函数?

#14


字符集全统一成UTF8吧,会少很多麻烦

#15


引用 12 楼 znit2003 的回复:
Quote: 引用 7 楼 scoredhigh 的回复:

AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 

不用转换 直接q1->Parameters->ParamByName("v1")->Value=filename; 就可以吧

#1


给地自己顶起来,期待高手的解决

#2


跟踪一下程序,看下你的sql语气有没有问题,介意直接发源代码

#3


你检查插入的数据库字段的charset是不是utf8或是中文类型,如果不是,就会出错

#4


q1->SQL->Clear();
         q1->SQL->Add("insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8)");

         AnsiString filename =StrPas(fds[1].c_str());
         Log->Lines->Add("filename:"+filename);

         q1->Parameters->ParamByName("v1")->Value=filename;
         String cmpno=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v2")->Value=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v3")->Value=StrPas(fds[3].c_str());
         TDateTime now=Now();
         q1->Parameters->ParamByName("v4")->Value= FormatDateTime("yyyy-mm-dd hh:nn:ss",now);
         String taskno=cmpno+FormatDateTime("mmddhhnnss",now);
         q1->Parameters->ParamByName("v5")->Value=taskno;
         q1->Parameters->ParamByName("v6")->Value=StrPas(fds[4].c_str());
         q1->Parameters->ParamByName("v7")->Value=StrPas(fds[5].c_str());
         q1->Parameters->ParamByName("v8")->Value=StrPas(fds[6].c_str());

         q1->ExecSQL();

#5


引用 3 楼 scoredhigh 的回复:
你检查插入的数据库字段的charset是不是utf8或是中文类型,如果不是,就会出错


数据库字段使用的gb2312,如果把数据库字段改成utf8的话,BCB小程序不会报错,但是数据库表里面显示的却是乱码。

#6


引用 4 楼 znit2003 的回复:
q1->SQL->Clear();
         q1->SQL->Add("insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8)");

         AnsiString filename =StrPas(fds[1].c_str());
         Log->Lines->Add("filename:"+filename);

         q1->Parameters->ParamByName("v1")->Value=filename;
         String cmpno=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v2")->Value=StrPas(fds[2].c_str());
         q1->Parameters->ParamByName("v3")->Value=StrPas(fds[3].c_str());
         TDateTime now=Now();
         q1->Parameters->ParamByName("v4")->Value= FormatDateTime("yyyy-mm-dd hh:nn:ss",now);
         String taskno=cmpno+FormatDateTime("mmddhhnnss",now);
         q1->Parameters->ParamByName("v5")->Value=taskno;
         q1->Parameters->ParamByName("v6")->Value=StrPas(fds[4].c_str());
         q1->Parameters->ParamByName("v7")->Value=StrPas(fds[5].c_str());
         q1->Parameters->ParamByName("v8")->Value=StrPas(fds[6].c_str());

         q1->ExecSQL();
我大概知道了,你用的是参数,我以前遇到过,不要使用参数,使用参数中文时多半会报错

#7


AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);
q1->ExecSQL(); 

类似这种形式比较好

#8


把服务器和客户端的字符集改成一样的看看

#9


自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。

#10


引用 9 楼 cptang 的回复:
自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。
 这个办法我试过了,不行的哟。

#11


引用 10 楼 znit2003 的回复:
Quote: 引用 9 楼 cptang 的回复:

自定义安装mysql数据库,选择字符集为GB2312
用navicat for mysql管理工具来重新创建数据库

就可以解决了。
 这个办法我试过了,不行的哟。
用我说的那种方法,百分之百可以啊。
如果非要用参数的话,对应的字段赋值要加上转换函数,例如
q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);类似这样试试

#12





引用 7 楼 scoredhigh 的回复:
AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 

#13


引用 12 楼 znit2003 的回复:
Quote: 引用 7 楼 scoredhigh 的回复:

AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 
我以前试过,应该是可以的。 
你确认一下是否凡是有可能有中文的字段都使用了AnsiToUtf8函数?

#14


字符集全统一成UTF8吧,会少很多麻烦

#15


引用 12 楼 znit2003 的回复:
Quote: 引用 7 楼 scoredhigh 的回复:

AnsiString sql;
sql = "insert into import_wlm_task(ftpfile,cmpno,loginuser,uploadtime"
         ",taskno,boxcnt,bigpacklen,smallpacklen) values('" + filename + "', .....)";
q1->SQL->Clear();
q1->SQL->Add(sql);


类似这种形式比较好



采用这个方法不会报错,可以解决问题。

但是 q1->Parameters->ParamByName("v1")->Value=AnsiToUtf8(filename);这样的 转换函数还是提示错误 AnsiToUtf8(filename) 还有其他类似的函数么?能够进行正确的转换  
q1->ExecSQL(); 

不用转换 直接q1->Parameters->ParamByName("v1")->Value=filename; 就可以吧