首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么将通过ado从数据库取出的数据取出

2012-04-24 
如何将通过ado从数据库取出的数据取出部分代码如下char phone[50]int n 0CoInitialize(NULL)_Connect

如何将通过ado从数据库取出的数据取出
部分代码如下
char phone[50];
int n = 0;
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));

pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";
pConn->Open("","","",adConnectUnspecified);

  pRst=pConn->Execute("select * from authors",NULL,adCmdText);
  while(!pRst->rsEOF)
{
  m_listctrl.InsertItem(0,(_bstr_t)pRst->GetCollect("au_lname"),1);
  m_listctrl.SetItemText(0,1,(_bstr_t)pRst->GetCollect("phone"));
phone[n] = m_listctrl.SetItemText(0,1,(_bstr_t)pRst->GetCollect("phone"));
  m_listctrl.SetItemText(0,2,LPCTSTR(phone[n]));
pRst->MoveNext();
n++;
}
  pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
  CoUninitialize();
编译通过,但Clistctrl木有反应,求大神帮助

[解决办法]
你先确认是否从数据库里得到数据了,然后再确认是否显示控件没显示出来.这是ADO操作ACCESS数据的,连接字符串改成你得就行了,这个连接字符串不适合你的数据库:
头文件里开始处:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
头文件里类里:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

CPP文件里:
BOOL CDatabaseDll::OpenDatabaseFun(_ConnectionPtr pConnection,_RecordsetPtr pRecordset,_CommandPtr pCommand)
{
BOOL Result=TRUE;
HRESULT hr;
try
{
hr = pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
pConnection->ConnectionTimeout = 10;
// hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\NW.mdb","", "", adModeUnknown);//这是OFFICE2003以下的
hr = pConnection->Open("Provider=Microsoft.Ace.Oledb.12.0;Data Source=D:\\bagayalu.accdb;Jet OLEDB:Database Password=123456","", "", adModeUnknown);//这是OFFICE2007以上的,包括OFFICE2010,这个连接字符串就是在OFFICE2010下用的,没问题
 
//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//设置默认数据库

pCommand.CreateInstance(__uuidof(Command));
pCommand->CommandTimeout = 5;
pCommand->ActiveConnection = pConnection;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
Result=FALSE;
return Result;
}
_variant_t var;
float v1,v2,v3,v4;
CString Remark;
pRecordset.CreateInstance(__uuidof(Recordset));
try
{
pRecordset->Open("SELECT * FROM 表1",// 查询DemoTable表中所有字段
pConnection.GetInterfacePtr(),// 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("v1");
if(var.vt != VT_NULL)
v1=var.fltVal;
// strName = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("v2");
if(var.vt != VT_NULL)
v2=var.fltVal;
var = m_pRecordset->GetCollect("v3");
if(var.vt != VT_NULL)
v3=var.fltVal;
var = m_pRecordset->GetCollect("v4");
if(var.vt != VT_NULL)
v4=var.fltVal;
var = m_pRecordset->GetCollect("remark");
if(var.vt != VT_NULL)
Remark = (LPCSTR)_bstr_t(var);
m_pRecordset->MoveNext();
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
Result=FALSE;
return Result;
}
return Result
------解决方案--------------------


单步调试,先看你的SQL语句有没有从数据库获取到数据, 然后才是遍历,UI显示
[解决办法]
我用的是Xproer.OleDb这个类库,以.Net风格封装的,写起代码来像堆积木一样简单。
下面是使用Xproer.OleDb对数据库进行操作的示例:

C/C++ code
#include "stdafx.h"#include "XproerDataDef.h"#include "OleDb/OleDbCommand.h"#include "OleDb/OleDbConnection.h"#include "OleDb/OleDbDataReader.h"#include "OleDb/DataTable.h"#include "OleDb/DataRow.h"#include "OleDb/DataValue.h"using namespace Xproer::OleDb;//获取DataTable的示例void ADODataTable(OleDbCommand& cmd){    int count = 0;    cmd.ExecuteScalar(L"select count(*) from xdb_news",count);    auto_ptr<DataTable> table;    table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news"));    size_t rowCount = table->GetRowsCount();    for (int i = 0 ; i < rowCount ; ++i)    {        DataRow* row = table->GetRow(i);        DataValue* val = row->GetCel(0);                printf("时间:%d \r\n", val->ToBoolean() );    }}//使用OleDbDataReader快速读取数据的示例void ADORead(OleDbCommand& cmd){    OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");    USES_CONVERSION;    wstring title;    while(r->Read())    {        //r->GetString(0,title);                //printf("标题:%s \r\n",W2A(title.c_str()));        printf("ID:%f \r\n", r->GetFloat(0) );    }    r->Close();}//通过变量向数据库安全添加数据的示例void ADOAdd(OleDbCommand& cmd){    cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");    cmd.AddDoubleParam(L"@VDouble",125022.3180);    cmd.ExecuteNonQuery();}//高性能向数据库插入数据的示例void ADOParam(OleDbCommand& cmd){    cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");    cmd.AddInt32Param(L"@ID",886);    cmd.SetPrepared(true);    _variant_t index = (short)0;    _ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);    param->Value = 887;    cmd.ExecuteNonQuery();    param->Value = 888;    cmd.ExecuteNonQuery();    param->Value = 889;    cmd.ExecuteNonQuery();    param->Value = 890;    cmd.ExecuteNonQuery();    param->Value = 891;    cmd.ExecuteNonQuery();}//向数据库添加实数的示例void NumericScaleX(OleDbCommand& cmd){    OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");    _RecordsetPtr& rs = r->GetRecordsetPtr();    rs->MoveFirst();    _variant_t vi = (short)0;    FieldPtr fd = rs->Fields->GetItem(vi);    unsigned char numeri = fd->GetNumericScale();    unsigned char precision = fd->GetPrecision();    printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );    printf("GetPrecision:%d\r\n", fd->GetPrecision() );    printf("Value:%f\r\n", (float)fd->Value );    r->Close();}int _tmain(int argc, _TCHAR* argv[]){    ::CoInitialize(NULL);    OleDbConnection con;    con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");    con.Open();    OleDbCommand cmd(&con);    ADORead(cmd);        con.Close();    ::CoUninitialize();    //printf("总数:%d",count);    system("pause");    return 0;} 

热点排行