我第一次使用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 "铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪"
初始化接口:
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 "铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪"
TheValue = m_pRecordset->GetCollect("BIG_NAME");//得到字段BIG_NAME的值
if(TheValue.vt!=VT_NULL) //判断不为空
****=(char*)_bstr_t(TheValu);
是什么意思。
我写成
if(var.vt!=VT_NULL) //判断不为空
StrId=(char*)_bstr_t(var);
结果还是:"铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪"
可以了。
不过这是为什么?
_com_util::ConvertBSTRToString()是什么意思?
我写成strcpy(StrId,(char *)_bstr_t(var));为何也不行?