vc++ ado操作mysql , 中文存储成功,但是修改失败

Liang4 2010-11-17 05:55:25
还是老问题,编码问题
非常奇怪的是可以addnew存储,但是修改就会失败,
我现在脑袋都大了
一下午就倒腾这玩意了~
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));


pConn->ConnectionString="DRIVER={MySQL ODBC 5.1 Driver}; \
Data Source = trm_base; ";
try
{
HRESULT hr = pConn->Open("","","",adConnectUnspecified);

pConn->Execute("set character_set_connection='utf8'",NULL,adCmdText);
pConn->Execute("set character_set_results='utf8'",NULL,adCmdText);
pConn->Execute("set character_set_client='utf8'",NULL,adCmdText);

CString strSource = "select * from updatetest \
where 姓名='张' and 年龄='十岁'";

HRESULT hr2 = pRst->Open(_variant_t(strSource),
_variant_t(pConn, true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch (_com_error& err)
{
CString s;
s.Format("%s",err.Description());
}
pRst->MoveFirst();
while (!pRst->ADOEOF)
{
_variant_t varIndex("姓名");
_variant_t varValue("胡");
//pRes->AddNew(); //这里如果addnew,则可以重新填充一条记录,没一点问题
pRst->PutCollect(varIndex, varValue);//假如这里修改,
HRESULT hr = pRst->Update();//这里会显示返回值成功,但是实际上数据库里并没有修改,
pRst->MoveNext();
}
...全文
307 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Afterwards_ 2013-02-25
  • 打赏
  • 举报
回复
ADO连MYSQL BUG太多
Liang4 2010-11-30
  • 打赏
  • 举报
回复
结贴了,问题已经解决,
这是ado操作mysql的一个bug..
Liang4 2010-11-18
  • 打赏
  • 举报
回复
pConn->Execute("set character_set_connection='utf8'",NULL,adCmdText);
pConn->Execute("set character_set_results='utf8'",NULL,adCmdText);
pConn->Execute("set character_set_client='utf8'",NULL,adCmdText);
我在网上看的
其实set names utf8影响的几个地方
我安装mysql 的时候选择的是utf8
所以my.ini文件里的database,server等都已经是uft8了
只有上边的3个,需要设置,所以我添加了这三句话
效果跟set names utf8是一样的
而且我pConn->Execut("set names 'utf8'",NULL,adCmdText);
代码里根本不认这句话,说是错误命令
ACMAIN_CHM 2010-11-18
  • 打赏
  • 举报
回复
在执行前,先执行一次 "set names 'utf8'"
Liang4 2010-11-18
  • 打赏
  • 举报
回复
启动日志文件后,执行了一次,
show master status;看不到一些有用的信息。

直接打开日志文件,看到了下边一句话
SET `濮撳悕`='閼? WHERE `濮撳悕`=_latin1'寮?

where之后是 _latin1....,我就纳闷了,实际上我是已经查找到这条记录了
我的mysql用的都是utf8编码,为什么where会_latin1 ?难不成他内部转来转去的?
set `濮撳悕`='閼? 为什么这句就没_latin1 ?
难道问题出这里了?


ACMAIN_CHM 2010-11-18
  • 打赏
  • 举报
回复
如果查看日志,请参考手册中的说明。

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
ACMAIN_CHM 2010-11-18
  • 打赏
  • 举报
回复
打开你的MYSQL的普通查询日志功能,然后看看你的程序到底发送了SQL语句到数据库没有。 如果发送了,则看一下发送的语句到底是什么。如果没有发送,则可能是你的程序或者驱动的问题了。
Liang4 2010-11-18
  • 打赏
  • 举报
回复
CString strSource = "select * from updatetest \
where 姓名='张' and 年龄='十岁'";
这个是有记录的

variant_t var = pRst->GetCollect(varIndex);//假如这里修改,
这样是可以得到var的值得的,没错的。。我可就纳闷了~
Liang4 2010-11-18
  • 打赏
  • 举报
回复
CString strSource = "select * from updatetest \
where 姓名='张' and 年龄='十岁'";
这个是有记录的

variant_t var = pRst->GutCollect(varIndex);//假如这里修改,
这样是可以得到var的值得的,没错的。。我可就纳闷了~
Liang4 2010-11-18
  • 打赏
  • 举报
回复
1、直接修改后,update(),日志显示
UPDATE updatetest SET `濮撳悕`='姊?,`骞撮緞`='浜屽崄' WHERE `濮撳悕`=_latin1'寮? AND `骞撮緞`=_latin1'鍗佸瞾'
2、addnew()后,然后update日志显示
INSERT INTO `trm_base`.`updatetest`(`濮撳悕`,`骞撮緞`) VALUES ('姊?,'浜屽崄')
3、直接利用sql语句update,日志显示
update updatetest set 濮撳悕='姊?,骞撮緞='浜屽崄' where 濮撳悕='寮? and 骞撮緞='鍗佸瞾'勈銵

发现:1中,日志有_latin1的转换,我日他的,

ACMAIN_CHM 2010-11-17
  • 打赏
  • 举报
回复
ACMAIN_CHM 2010-11-17
  • 打赏
  • 举报
回复
估计这 CString strSource = "select * from updatetest \
where 姓名='张' and 年龄='十岁'";
根本没有符合条件记录

检查你的字符集。按下贴中检查方法贴出你的检查结果。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧