求:ADO接口_RecordsetPtr::GetCollect()提取字符串时到底给你隐式转换了什么?

街坊跳舞 2008-08-22 04:35:44
ADO接口查询SQL数据库,在使用_RecordsetPtr::GetCollect(L"列名")读取一条记录中的字符串类型的时候,返回的万能变量_variant_t vt中是一个BSTR类型的字符串,而这个字符串所存储的二进制并不是SQL数据库中字符串对应的二进制?
那位大侠知道这中间的秘密,给解释下!


_variant_t var = pRecordset->GetCollect( L"列名" );
// 对应"列名"的SQL数据库中的变量类型是"char[256]"(就是SQL 的 char 类型,长度256)
// 数据库中的二进制是:A4 EB A5 FA C4 5F B2 B0 20(月光寶盒)
// 读取出来var.bstrVal中存放的是:8b 30 80 e7 73 81 36 82 20 00
// 而更不可理解的是在不同语言的操作系统上(比如繁体Windows)var.bstrVal是跟简体windows环境下不一样的!
// 现在可以肯定的一点是:这中间进行了某种隐式转换,但是我不知道是什么!求助 。。。 。。。
...全文
1037 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shakaqrj 2008-08-29
  • 打赏
  • 举报
回复
不知道
你可以通过调试将该结构点开来看看
街坊跳舞 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zaodt 的回复:]

CString str = var.bstrVal;

MessageBox(str);


如果显示结果正确,那就可以了;至于中间做了什么,比较复杂,以后可慢慢研究。
[/Quote]

现在就是要研究这个复杂的过程,如果你知道,麻烦不惜赐教!
xsc2001 2008-08-26
  • 打赏
  • 举报
回复
除了二进制字段外都是BSTR类型的,所以可以直接转换成CString或者char*,即使是整型或者float型字段都可以先转成char*后再转成相应类型,如:
_variant_t var = pRecordset->GetCollect( L"姓名" );
CStrng strName = (char *)_bstr_t(var);

var = pRecordset->GetCollect( L"年龄" );
CStrng strAge = (char *)_bstr_t(var);
int nAge = atoi(strAge);

var = pRecordset->GetCollect( L"体重" );
CStrng strWeight = (char *)_bstr_t(var);
float fWeight = atof(strWeight);
analysefirst 2008-08-26
  • 打赏
  • 举报
回复
楼上的都说了.我路过.
zaodt 2008-08-23
  • 打赏
  • 举报
回复

CString str = var.bstrVal;

MessageBox(str);


如果显示结果正确,那就可以了;至于中间做了什么,比较复杂,以后可慢慢研究。
jxufeng 2008-08-23
  • 打赏
  • 举报
回复
1、windows字符编码有很多种,不如asci unicode utf-8等,你用记事本随便写个点东西,分别保存(可以选择编码)为asci 和utf8及其他格式,然后你用cfile读入到一个char数组中,看看分别是些什么东西吧!也可以用ultraedit去查看它们的二进制。
2、c++中的字符串分为窄和宽,也就是char 和 wchar,前者一个字节,后者两个字节,在vc6下cstring 是char,而所有的bstr都是wchar,同一个字符,两者里面的东西大不一样的,他们之间的转换还挺麻烦的。
由于上述两个原因,你看到的东西不同,比如数据库里本来存的是asci,读出来的时候给你转成unicode的宽字符,最后给你写成了一个utf8的文本文件,差距就大得去了。
上述东西也是搞vc的人必须学会的,不然对很多事情无从下手了。当然,这些问题用c#就简单啰!
primer_programer 2008-08-23
  • 打赏
  • 举报
回复
如果想存储二进制,最好不要用数据库中的varchar等类型。因为如果是二进制数据,在程序中存储,传递都是个麻烦的事情。
使用binary类型:有两种方法:
http://blog.csdn.net/primer_programer/archive/2008/07/01/2602267.aspx
http://blog.csdn.net/primer_programer/archive/2008/07/01/2602305.aspx

内存泄漏 2008-08-22
  • 打赏
  • 举报
回复
直接用字符串(LPCSTR)_bstr_t(var);试试..

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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