本程序是通过ADO访问数据库里内容并输出,
结果发现在以下程序中,直接输出“(char*)(_bstr_t)(m_pRecordset->Fields...”则结果正确,
而输出“sName”则全变成了乱码。
不知道字符串操作哪里出错了,谢谢!
while(m_pRecordset->adoEOF==VARIANT_FALSE) 
{
//Retrieve column's value: 
char *sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value);
cout<<(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value)<<endl;
cout<<sName<<endl;  //上行输出正确!!该行输出变成乱码!!
m_pRecordset->MoveNext(); 
}

解决方案 »

  1.   

    先说说你的开发环境吧。
    VC6 ?
    VC2005 ?UNICODE 工程吗?
      

  2.   

    是不是读出来的数据非英文,而你又用的是多字节方式,所以输出乱码。
    改成Unicode方式看看。
      

  3.   


    我使用的是VC6下的WIN32 CONSOLE APPLICATION工程,没有涉及到中文
      

  4.   

    用的是SQLSERVER,该字段在表里的定义是

    列名      数据类型  长度  允许空
    au_lname varchar 40    允许空
      

  5.   

    现在同样的程序,换成了ORACLE数据库,也出现同样的问题
      

  6.   

    string sName=(LPCSTR)(bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value); 
    换成字符串类型呢?
      

  7.   

    1.加入 #include <string.h>
    2.改为string sName=(LPCSTR)(bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value); 编译,出现如下错误:
    D:\VC\c_ado\c_oracle.cpp(54) : error C2065: 'string' : undeclared identifier
      

  8.   

    char *sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value); 
    --->
    _variant_t var;
    var = m_pRecordset->Fields->GetItem(_variant_t("au_lname"))->Value;
    char *sName = var.bstrVal;
    -------
    这样呢?
      

  9.   

    谢谢!还是有问题
    char *sName = var.bstrVal; 该行出现问题
    D:\VC\c_ado\c_oracle.cpp(55) : error C2440: 'initializing' : cannot convert from 'unsigned short *' to 'char *'
      

  10.   

    char *sName=(char*)(_bstr_t)m_pRecordset->GetCollect("au_lname");
    这样看看,在MFC用过,,
      

  11.   

    很郁闷,还是不行哦。输出"error 5!"try
    {
    m_pRecordset->MoveFirst(); 
    while(m_pRecordset->adoEOF==VARIANT_FALSE) 
    {
    char *sName=(char*)(_bstr_t)m_pRecordset->GetCollect("au_lname"); 
    cout<<(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value)<<endl;
    cout<<sName<<endl;
    m_pRecordset->MoveNext(); 
    }
    }
    catch (_com_error &e)
    {
    cout<<"error 5!"<<endl;
    }
      

  12.   

    最好先处理一下GetItem(_variant_t("au_lname"))->Value出来的结果,可能是格式问题
      

  13.   

    原来参考处用的是 CString sName=...,
    但我的工程是win32 console application工程,好象不能用CString吧。