我用OLE DB连接ACCESS 表时,打开是成功的,但数据库中本来有三个字段,却读出四个,有几个记录,却显示没有记录,不知道是为什么?
解决方案 »
- vs2008 编译错误 error C1189,winnt.h编译报错
- 我如何把COM组件里的字符串变量传递给该COM组件里的ChtmlView类所指示的URL文件里的IFRAME。
- 装了vc6.0后就不能访问工行了
- Win32编程菜鸟问题_切断字符窜问题
- unicode和UTF8有何区别?
- 关于用RAW SOCKET发送TCP报文段的问题:用Send 还是Sendto?
- 怎么样将CFileDialog打开的路径文件保存在当前目录
- 一个DLL的问题
- ATL建立的ActiveX怎么管理方法?
- 学习winsock2刚上路就碰壁,用WSAStartup怎么会包错?代码就3行可我找不到原因。请进.
- 用OLE DB 连接ACCESS数据库不能正确打开表
- 数组下标从1开始如何定义?
那么使用参数adOpenStatic,才可以,
adOpendynamic总是得到记录数0对特别是ADO在多线程的时候它的有时是return的更是-1,可能是一个BUG吧,自己计数吧
int count;
while(!m_pRecordset->adoEOF)
{
count++;
m_pRecordset->MoveNext();
}
m_pRecordset->MoveFirst();
BOOL CAddressList::ConnectDB()
{
HRESULT hr;
hr = m_DataSource.Open(_T("Microsoft.Jet.OLEDB.4.0"), _T("DbNet.mdb"));//打开数据源
if (FAILED(hr))
{
GetLastError(m_szLastErrorDesc);
CString str = m_szLastErrorDesc;
WriteLog(str, str.GetLength(), _T("Error:"));
return FALSE;
}
//打开会话。
hr = m_session.Open(m_DataSource);
if(FAILED(hr))
{
m_DataSource.Close();
GetLastError(m_szLastErrorDesc);
CString str = m_szLastErrorDesc;
WriteLog(str, str.GetLength(), _T("Error:"));
return FALSE;
} m_bConnect = TRUE;
return TRUE;
}
BOOL CAddressList::ExecuteSQL(LPCTSTR pszSQL, CCommand<CManualAccessor> *prs)
{
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);
HRESULT hr = prs->Open(m_session, pszSQL, &propset, NULL, DBGUID_DBSQL, FALSE);
if (FAILED(hr))
{
GetLastError(m_szLastErrorDesc);
CString str = m_szLastErrorDesc;
WriteLog(str, str.GetLength(), _T("Error:"));
return FALSE;
} return TRUE;}BOOL CAddressList::OnInitDialog()
{
//................
if (!ConnectDB())
{
AfxMessageBox(m_szLastErrorDesc);
CDialog::OnCancel();
return FALSE;
}
//.....................
}
void CAddressList::LoadHistory(CMapStringToString &mapHIstory)
{
//.........................................
if(!m_bConnect)
{
CString str = _T("数据库没有打开!");
WriteLog(str, str.GetLength(), _T("Error:"));
return;
}
CString strSQL;
strSQL.Format(_T("SELECT * FROM History WHERE HID > '%d'"), nBegin);
CCommand<CManualAccessor> *prs = new CCommand<CManualAccessor>;
if (!ExecuteSQL(strSQL,prs ))
{
delete prs;
prs = NULL;
return;
}
else if (prs->m_spRowset == NULL)
{
CString str = _T("没有记录!");
WriteLog(str, str.GetLength(), _T("Error:"));
}
else
{
USES_CONVERSION;
ULONG ulColumns = 0;
DBCOLUMNINFO* pColumnInfo = NULL;
LPOLESTR pStrings = NULL;
try
{ //得到列属性
if (prs->GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
throw;
//帮定缓存区
struct MYBIND* pBind = new MYBIND[ulColumns];
prs->CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);
ULONG ulFields = prs->GetColumnCount(); WORD wType;
for (long l = 0; l < ulFields; l++)
{
if (pColumnInfo[l].dwFlags & DBCOLUMNFLAGS_ISLONG )
{
pColumnInfo[l].wType = DBTYPE_IUNKNOWN;
wType = pColumnInfo[l].wType;
}
else
wType = DBTYPE_STR;
prs->AddBindEntry(l+1, wType, sizeof(TCHAR)*40, &pBind[l].szValue,
NULL, &pBind[l].dwStatus);
}
prs->Bind();
//显示各个行
while(prs->MoveNext() == S_OK)
{
for (ULONG j=0; j< ulFields; j++)
{
CString str;
if (pBind[j].dwStatus == DBSTATUS_S_ISNULL)
{
break;
}
else if (pColumnInfo[j].wType == DBTYPE_IUNKNOWN)
{
ISequentialStream* pStream = *(ISequentialStream**)pBind[j].szValue;
ULONG lRead = 0;
char szBuf[CONTENT_LEN];
do
{
pStream->Read(szBuf, CONTENT_LEN - 1, &lRead);
szBuf[lRead] = '\0';
str += szBuf;
} while (lRead == CONTENT_LEN - 1);
}
else
{
str = pBind[j].szValue;
}
if(j == 0)
{
strTitle = str;
}
else
{
strURL = str;
}
}
if(strTitle.IsEmpty()|| strURL.IsEmpty())
{
continue;
}
mapHIstory.SetAt(strTitle, strURL);
}
delete pBind;
}
catch(...)
{
GetLastError(m_szLastErrorDesc);
CString str = m_szLastErrorDesc;
WriteLog(str, str.GetLength(), _T("Error:"));
return ;//返回TRUE表明错误信息已经显示。
}
}
prs->Close();
delete prs;
prs = NULL;
}
try
{ //得到列属性
if (prs->GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
throw;
//帮定缓存区
ulColumns = 3;//手动加这句了!
然后试一试了!