我第一次使用vc++来访问sql server2000数据库。可是我不知道为何记录集字段返回的值是乱码。请问谁知道原因。
初始化接口:
BOOL InitAdo()
///////////This is a function to initinalize the object of Adodb
{
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_WNDW);
HRESULT hr;
//_RPT0(_CRT_WARN,"Pass Ok");
try
{
CoInitialize(NULL);
}
catch (_com_error *e)
{
_RPT1(_CRT_WARN,"Error:%s",(char*)( e->Description()));
}
//_RPT0(_CRT_WARN,"Pass Ok");
try
{
hr=pConn.CreateInstance("ADODB.Connection");
hr=pRecordset.CreateInstance("ADODB.Recordset");
//_RPT0(_CRT_WARN,"Pass Ok");
///////////////To set connection here
//pConn->Open("Provider=sqloledb;Data Source=AppDate;UId=sa;PWD=cloudq;","","",adModeUnknown);
pConn->Open( "dsn=AppData;uid=sa;pwd=cloudq;","","",adModeUnknown);
}
catch (_com_error *e)
{
_RPT1(_CRT_WARN,"Error:%s",(char*)( e->Description()));
}
return TRUE;
}取得记录集并用RPT1来显示字段值:
BOOL GetRecordset()
{
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_WNDW);
 _variant_t var;
 char *StrId;
 char *StrContent;
char *SqlString="SELECT * FROM TableData";
try
{
pRecordset->Open(SqlString,pConn.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
}
catch (_com_error *e)
{
_RPT1(_CRT_WARN,"Error:%s",(char*)( e->Description()));
}
//var=pRecordset->GetCollect("Aid");
var=pRecordset->Fields->GetItem ("Aid")->Value;
_ASSERT(var.vt!=VT_NULL);
StrId=(char *)_bstr_t(var);
// StrId=(LPCSTR)_bstr_t(var);
_RPT1(_CRT_WARN,"StrId:%s",StrId); var=pRecordset->GetCollect ("AContent");
StrContent=(char *)_bstr_t(var);
_RPT1(_CRT_WARN,"StrContent:%s",StrContent);
return TRUE;
}
结果输出:
StrId "铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪"

解决方案 »

  1.   

    _variant_t  TheValue;  
    TheValue  =  m_pRecordset->GetCollect("BIG_NAME");//得到字段BIG_NAME的值  
    if(TheValue.vt!=VT_NULL)  //判断不为空
        ****=(char*)_bstr_t(TheValu);
      

  2.   

    "****=(char*)_bstr_t(TheValu);"
    是什么意思。
    我写成
    if(var.vt!=VT_NULL)  //判断不为空
        StrId=(char*)_bstr_t(var);
    结果还是:"铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪"
      

  3.   

    StrId=(char *)_bstr_t(var);在这一句之前,直接AfxMessageBox((_bstr_t)var);试试看是不是乱码??
      

  4.   

    我在api 情况下写成:::MessageBoxA(NULL,(char *)((_bstr_t)var),"output",MB_OK);
    可以了。
    不过这是为什么?
      

  5.   

    StrId = _com_util::ConvertBSTRToString((_bstr_t)var);
      

  6.   

    谢谢。可以的。不过问题出在哪里?
    _com_util::ConvertBSTRToString()是什么意思?
    我写成strcpy(StrId,(char *)_bstr_t(var));为何也不行?
      

  7.   

    strcpy(StrId,_com_util::ConvertBSTRToString((_bstr_t)var));在你的显示函数前面调用这一条再试试看。
      

  8.   

    你的显示函数是支持ASII码的,而ADO返回的字符串全是UNICODE,所以你必须把UNICODE的字符串转换成ASCII码再调用你的显示函数。_com_util::ConvertBSTRToString((_bstr_t)var)这个函数就是把UNICODE转换成ASCII码的。