我用ADO访问SQL SEVER数据库,连接正确。在实际运行时,总提示内存访问冲突。其中涉及的一个函数源码如下(访问数据库并把结果插到列表控件中):
void CBasicParaBillDLG::ListBParaBills()//该函数有问题
{
//先清空列表
m_ctrlBasicParaBillLst.DeleteAllItems();
_RecordsetPtr m_pADOSet2;
CString strSQL;
strSQL="SELECT * FROM BASIC_PARA";
HRESULT hTRes;
hTRes = m_pADOSet2.CreateInstance(_T("ADODB.Recordset"));
if (SUCCEEDED(hTRes))
{
//---------------------------------------------------
if ( m_pADOSet2->State == adStateOpen) m_pADOSet2->Close();
hTRes =m_pADOSet2->Open((LPTSTR)strSQL.GetBuffer(130),
_variant_t((IDispatch* )(((CToolCADApp*)AfxGetApp())->ADOConn),true),adOpenDynamic,adLockPessimistic,adCmdText); if(!SUCCEEDED(hTRes))
{
AfxMessageBox("打开BASIC_PARA表出错");
return;
}
} //将数据填入表中
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
int iActive = 0;
int iItem = 0;
while(!m_pADOSet2->adoEOF)
{
for(int i=0;i<18;i++)
{
if(i==0)
lvItem.iItem = iItem;
else
lvItem.iItem = iActive;
lvItem.iSubItem = i;
CString str;
switch(i)
{
case 0://基本参数编号No
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("基本参数编号No"));
break;
case 1://花键轴规格
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("花键轴规格"));
break;
case 2://外径da
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("外径da"));
break;
case 3://上偏差daLup
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("上偏差daLup"));
break;
case 4://下偏差daLlow
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("下偏差daLlow"));
break;
case 5://内径df
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("内径df"));
break;
case 6://上偏差dfLup
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("上偏差dfLup"));
break;
case 7://下偏差dfLlow
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("下偏差dfLlow"));
break;
case 8://倒角c
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("倒角c"));
break;
case 9://上偏差cLup
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("上偏差cLup"));
break;
case 10://下偏差cLlow
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("下偏差cLlow"));
break;
case 11://齿根小沟深度f
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("齿根小沟深度f"));
break;
case 12://齿根小沟宽度e
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("齿根小沟宽度e"));
break;
case 13://花键轴键侧有效直线部分起点半径rp
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("花键轴键侧有效直线部分起点半径rp"));
break;
case 14://花键轴齿数z
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("花键轴齿数z"));
case 15://花键轴键宽b
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("花键轴键宽b"));
break;
case 16://上偏差bLup
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("上偏差bLup"));
break;
case 17://下偏差bLlow
str = (char*)(_bstr_t)m_pADOSet2->GetCollect(_variant_t("下偏差bLlow"));
}
lvItem.pszText = str.GetBuffer(0);
if(i==0)
iActive = m_ctrlBasicParaBillLst.InsertItem(&lvItem);
else
m_ctrlBasicParaBillLst.SetItem(&lvItem);
}
iItem ++;

m_pADOSet2->MoveNext();
}
m_pADOSet2->Close();
}
我多次调试,问题出在下面的代码上:
hTRes =m_pADOSet2->Open((LPTSTR)strSQL.GetBuffer(130),
_variant_t((IDispatch* )(((CToolCADApp*)AfxGetApp())->ADOConn),true),adOpenDynamic,adLockPessimistic,adCmdText);
这种打开记录集的方式在同一工程访问同一数据库的不同表时正确。可偏偏在这里有问题。我试过,若把上面的代码及它下面的if(!SUCCEEDED(hTRes))注释掉,程序能运行,(当然没有访问到数据库)。而且我每次都把打开的记录集及时关掉。请问各位高手是何原因?望不吝赐教!

解决方案 »

  1.   

    顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
    顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶顶 顶顶顶  顶顶顶顶顶 
    顶顶顶顶顶顶    顶顶顶顶顶顶顶 顶顶顶顶 顶顶顶顶顶 
    顶顶顶顶顶   顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶 
    顶顶顶顶  顶顶顶顶顶顶顶顶顶顶顶顶 顶   顶顶 顶顶 
    顶顶  顶 顶顶顶顶顶顶顶顶顶顶  顶顶顶 顶顶   顶 
    顶顶顶顶顶 顶顶顶顶顶顶顶顶顶   顶顶顶   顶顶顶顶 
    顶顶顶顶   顶顶顶顶顶顶顶顶顶顶 顶  顶 顶顶顶顶顶 
    顶顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶  顶  顶   顶顶 
    顶顶   顶  顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶 
    顶 顶顶   顶顶顶顶顶顶顶顶   顶   顶 顶顶顶顶 
    顶顶顶顶顶  顶顶顶顶顶顶顶顶 顶  顶顶 顶 顶顶顶顶 
    顶顶顶顶    顶顶顶顶顶顶 顶顶 顶顶顶顶顶 顶顶顶顶 
    顶顶顶  顶顶   顶顶顶顶 顶  顶顶 顶顶 顶顶顶顶 
    顶   顶顶顶顶    顶顶顶顶顶 顶顶顶   顶顶顶顶