ado mysql操作有关问题, 深厚功力的大侠求解
ado mysql操作问题, 深厚功力的大侠求解~
本人mysql show variables like "%char%"
除了 filesystem=binarery;
其他均为uft8,所以mysql安装应该不存在问题(自我认为)
如下代码解惑~::
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
HRESULT hr1;
pConn->ConnectionString="DRIVER={MySQL ODBC 5.1 Driver}; \
Data Source = trm_base; "; (trm_base ODBC连接远程数据库)
try
{
HRESULT hr = pConn->Open("","","",adConnectUnspecified);
CString strSource = "select * from updatetest \
where 姓名='张'";//通过这条sql语句可以查询到一条记录集(数据库里只这一条记录)
HRESULT hr2 = pRst->Open(_variant_t(strSource),
_variant_t(pConn, true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
pRst->MoveFirst();
while (!pRst->ADOEOF)
{
_variant_t varO = pRst->GetCollect("姓名");//var0可以得到查询的值,是正确的
//pRst->Put_Bookmark((_variant_t)(short)1);
//hr1 = pRst->Delete(adAffectCurrent);
//pRst->AddNew();//假如放开这句代码, 可以添加数据成功,否则更新失败
pRst->PutCollect("姓名", "梁");
pRst->PutCollect("年龄", "二十");
hr1 = pRst->Update();//返回值始终成功,但是数据库并未更新
pRst->MoveNext();
}
}
catch (_com_error& err)
{
CString s;
s.Format("%s",err.Description());
TRACE(s);
}
经查看mysql日志发现,只有在pRst->update()更新修改的时候,日志里显示了语句 where "***"=latin1"***"
也就是说每次更新这个,mysql内部都给我添加了个latin1转换
假如我的原数据位英文,则latin1"***" 没影响,可以更新成功
但是我的数据是中文,则更新修改失败
而pRst->AddNew()时,添加一条记录,没有条件where出现,所以添加成功
这时候有些那么,我的"select * "语句也包含了where,利用Open打开,难道Ado把编码都处理好了,然后才通过ODBC给mysql ?
至于mysql为什么要给我latin1转换,我实在摸不着头脑,我安装是uft8,
mysql show variables like "%char%" 已经看不到latin1的字眼了,
谁能帮忙分析下?
------解决方案--------------------
我现在跟你的条件完全一样,没有出现过你这样的问题。
记住Update语句的基本处理
CString strSQL;
strSQL.Format("update youtablename set updatefield='%s' where keyid='%s'",strValue,strKeyIDValue);
m_pDBCmd->Execute(NULL,NULL,adCmdText);
这样的语句用过上千条了,没发现一条有问题的,有事再联系我,哈哈!
本人mysql show variables like "%char%"
除了 filesystem=binarery;
其他均为uft8,所以mysql安装应该不存在问题(自我认为)
如下代码解惑~::
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
HRESULT hr1;
pConn->ConnectionString="DRIVER={MySQL ODBC 5.1 Driver}; \
Data Source = trm_base; "; (trm_base ODBC连接远程数据库)
try
{
HRESULT hr = pConn->Open("","","",adConnectUnspecified);
CString strSource = "select * from updatetest \
where 姓名='张'";//通过这条sql语句可以查询到一条记录集(数据库里只这一条记录)
HRESULT hr2 = pRst->Open(_variant_t(strSource),
_variant_t(pConn, true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
pRst->MoveFirst();
while (!pRst->ADOEOF)
{
_variant_t varO = pRst->GetCollect("姓名");//var0可以得到查询的值,是正确的
//pRst->Put_Bookmark((_variant_t)(short)1);
//hr1 = pRst->Delete(adAffectCurrent);
//pRst->AddNew();//假如放开这句代码, 可以添加数据成功,否则更新失败
pRst->PutCollect("姓名", "梁");
pRst->PutCollect("年龄", "二十");
hr1 = pRst->Update();//返回值始终成功,但是数据库并未更新
pRst->MoveNext();
}
}
catch (_com_error& err)
{
CString s;
s.Format("%s",err.Description());
TRACE(s);
}
经查看mysql日志发现,只有在pRst->update()更新修改的时候,日志里显示了语句 where "***"=latin1"***"
也就是说每次更新这个,mysql内部都给我添加了个latin1转换
假如我的原数据位英文,则latin1"***" 没影响,可以更新成功
但是我的数据是中文,则更新修改失败
而pRst->AddNew()时,添加一条记录,没有条件where出现,所以添加成功
这时候有些那么,我的"select * "语句也包含了where,利用Open打开,难道Ado把编码都处理好了,然后才通过ODBC给mysql ?
至于mysql为什么要给我latin1转换,我实在摸不着头脑,我安装是uft8,
mysql show variables like "%char%" 已经看不到latin1的字眼了,
谁能帮忙分析下?
------解决方案--------------------
我现在跟你的条件完全一样,没有出现过你这样的问题。
记住Update语句的基本处理
CString strSQL;
strSQL.Format("update youtablename set updatefield='%s' where keyid='%s'",strValue,strKeyIDValue);
m_pDBCmd->Execute(NULL,NULL,adCmdText);
这样的语句用过上千条了,没发现一条有问题的,有事再联系我,哈哈!