使用mysql的api执行sql后产生的异常

artlands 发布于 2016/09/04 19:16
阅读 301
收藏 0
情况说明:

程序使用了mysql的api执行SQL指令进行数据储存,当储存的数据为完全的拉丁字母及字符的时候,程序完全正常,没有任何问题,但当储存的数据中包含了中文(没有换行符),在没有修改任何源代码的情况下,程序就会出现多种不同的异常。

嫌疑代码段:
{
QString str_A,str_B,SQL,id_str;
bool ok;//a_Side为假值时,为B面
QString DB_NAME="kn_"+m_majorCode;
ok=connectToServer(_errMsg,DB_NAME);//连接数据库
if(!ok)
{
_errMsg="连接数据库失败!";
return false;
}
//添加新卡片
if (!(_new_A_Side.isEmpty()))
{
int len=_new_A_Side.length();
int i=len-1;
while(i>=0)
{
str_A=_new_A_Side.at(i);
str_B=_new_B_Side.at(i);
SQL=QString("INSERT INTO %1 (ASide,BSide) VALUES ('%2','%3')").arg(m_classCode).arg(str_A).arg(str_B);
ok=runSQL(_errMsg,SQL);
if(!ok)
{
//updateSucceed=false;//插入不成功,表格与服务器的数据不一致
return false;
}
_new_A_Side.removeAt(i);
_new_B_Side.removeAt(i);
i--;
}
}
if(!_modify_id.isEmpty())
{
int len=_modify_id.length();
int i=len-1;
while(i>=0)
{
if(_modify_side.at(i)=="1")//A面
{
SQL=QString("UPDATE %1 SET ASide='%2' WHERE Id='%3'").arg(m_classCode).arg(_modify_side_text.at(i)).arg(_modify_id.at(i));
}else{//B面
SQL=QString("UPDATE %1 SET BSide='%2' WHERE Id='%3'").arg(m_classCode).arg(_modify_side_text.at(i)).arg(_modify_id.at(i));
}
ok=runSQL(_errMsg,SQL);
if(!ok)
{
//updateSucceed=false;//有数据未被更新,表格数据与服务器数据仍不一致
return false;
}
_modify_id.removeAt(i);
_modify_side.removeAt(i);
_modify_side_text.removeAt(i);
i--;
}
}
//删除保存在删除链表的卡片数据

if (!_eraseLinker.isEmpty())
{
int len=_eraseLinker.length();
int i=len-1;
while(i>=0)
{
id_str=_eraseLinker.at(i);
SQL=QString("DELETE FROM %1 WHERE Id='%2'").arg(m_classCode).arg(id_str);
SQL=e1+m_classCode+e2+id_str+e3;
ok=runSQL(_errMsg,SQL);
if(!ok)
{
return false;
}
_eraseLinker.removeAt(i);
i--;
}
}
closeServer();//关闭数据库
return true;
}

在进行跟踪后,发现程序每次都能正确执行完使用SQL的函数,执行完该函数后才会在别的地方出现异常,而不是在执行SQL指令的时候出错,执行SQL指令的代码段:

{
if(!m_MySQLIsOpen){
Msg = "请先连接数据库!";
return 0;
}
char * SQL=QString2Local(SQLC);
char sql[2048];
strcpy(sql,SQL);
//unsigned long l=mysql_real_escape_string(&mysql,sql,SQL,strlen(SQL));
if(mysql_query(&mysql,sql) != 0)
{
//Msg = "数据更新错误!";
Msg =mysql_error(&mysql);
return 0;
}
return 1;
}
曾经以为是QTableWidget的问题,把QTableWidget换成QTableView后,问题依旧,然后放弃使用组件,直接使用QStringList作为容器进行数据处理,问题仍然依旧。
有高手知道是怎么回事吗?我想知道如何处理这个异常。

加载中
0
宏哥
宏哥
Postgresql
0
o
oneflower
应该是你的中文乱码导致的
mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级
你查下你各级别字符集跟校对规则,修改成你需要的字符集及校对规则就可以了。

参考自:MySQL的字符集和校对
0
a
artlands

引用来自“oneflower”的评论

应该是你的中文乱码导致的
mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级
你查下你各级别字符集跟校对规则,修改成你需要的字符集及校对规则就可以了。

参考自:MySQL的字符集和校对

这个问题我在别的地方讨论过,但仍然没有头绪。中文显示没有任何乱码问题。

最令困惑的是问题的发生不是总在同一位置,有时候在qwidget.cpp文件,有时候在qhash.h文件(这个是Qt的文件),有时候在output.c文件(这个是VC的文件),有时候在qbasicatomic.h(这个是Qt的文件)。而这只有在SQL语句中包含中文的时候才会有这种问题,仅有英文字母的时候永远不会出现这些问题。

0
a
artlands

引用来自“oneflower”的评论

应该是你的中文乱码导致的
mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级
你查下你各级别字符集跟校对规则,修改成你需要的字符集及校对规则就可以了。

参考自:MySQL的字符集和校对

我在CSDN跟别人讨论过编码的问题了,异常不是出现在执行SQL指令的时候,而是执行完才会出现异常,而且执行是成功的,数据也会被正确储存。我曾经怀疑过有没有动态控件没有初始化,但却没找到,而且,SQL只有英文字母的时候完全不会出现问题,这就导致问题的根源不知道产生在哪里。

http://bbs.csdn.net/topics/392014079

0
a
artlands

引用来自“宏哥”的评论

Postgresql
改变数据引擎?????你确认问题的根源是数据库?
0
newzai
newzai
建议你使用C++ ORM ODB +Qt
0
a
artlands

引用来自“newzai”的评论

建议你使用C++ ORM ODB +Qt
你有这方面的资料吗?我还没接触过这个东东
0
newzai
newzai

引用来自“newzai”的评论

建议你使用C++ ORM ODB +Qt

引用来自“artlands”的评论

你有这方面的资料吗?我还没接触过这个东东
http://www.codesynthesis.com/products/odb/ 文档很详细,例子也很多。入门还算简单。
返回顶部
顶部