用OLE DB 连接ACCESS表,不能正确打开 我用OLE DB连接ACCESS 表时,打开是成功的,但数据库中本来有三个字段,却读出四个,有几个记录,却显示没有记录,不知道是为什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 哈哈...不会吧,有这么好笑的事情,把你的程序和数据库发给我看看,[email protected] 如果你使用的是 ado那么使用参数adOpenStatic,才可以,adOpendynamic总是得到记录数0对特别是ADO在多线程的时候它的有时是return的更是-1,可能是一个BUG吧,自己计数吧int count; while(!m_pRecordset->adoEOF){ count++; m_pRecordset->MoveNext();} m_pRecordset->MoveFirst(); hr=m_connection->Open(source,user,pwd,16); 大概的代码: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;//手动加这句了!然后试一试了! to nonocast:要那么都分有什么好处吗?难得就不能说点别的?to stavck:谢谢! 如何让编译之后的EXE区段混乱点 windows编程什么时候必须用VirtualAlloc()? VC++6.0下,使用ADO方式对ACCESS2000数据库进行条件查询遇到的问题。出现异常中断。 [100]金山毒霸2005-------开机登入系统之前/或者“注销”时就能显示出来程序图标 我的对话框哪里去了? vb调用VC写的com错误 请问VC是否支持对XML的读写. 请教高手 教莱鸟,怎样保存为文本文件? 如何将网页中的多个关键字替换成相关的链接? 请问大虾关于vc网络编程!!!急 多线程问题,好伤脑金
那么使用参数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;//手动加这句了!
然后试一试了!
谢谢!