[求助] 连接ACESS数据库不正常,
各位好:我的部分源代码如下:void CDlgShowHistoryData::OnInitADOConn()
{
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
CString strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\MyHFData\\20121115.MDB;Persist Security Info=False";
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
//使用Open方法连接数据库
hr = m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);///连接数据库
}
}
catch(_com_error e)///捕捉异常
{
AfxMessageBox("连接数据失败,请检查数据库路径是否正确!");
}
::CoInitialize(NULL);
}
void CDlgShowHistoryData::FindDataFormAccess(_bstr_t strSQL)
{
//连接数据库
OnInitADOConn();
//设置查询字符串
_bstr_t bstrSQL = strSQL; //"select * from YSDATA order by 通道编号 desc";
//创建记录集指针对象实例
// m_pRecordset.CreateInstance(__uuidof(Recordset));//该句也可以使用
m_pRecordset.CreateInstance("ADODB.Recordset");//代替
//打开记录集
// m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockPessimistic,adCmdText);
// _variant_t((IDispatch *)theApp.m_pConnection,true)
m_pRecordset->Open(bstrSQL,_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
m_ListShowHisData.InsertItem(0,"");
m_ListShowHisData.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("DTU编号"));
m_ListShowHisData.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("通道编号"));
m_ListShowHisData.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("日期"));
m_ListShowHisData.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("时间"));
//将记录集指针移动到下一条记录
m_pRecordset->MoveNext();
}
//断开数据库连接
ExitConnect();
}
第一次运行,一切正常
void CDlgShowHistoryData::OpenAcessDataToList()
{
m_ListShowHisData.SetBkColor(RGB(255,240,242));
m_ListShowHisData.SetTextBkColor(RGB(255,240,242));
m_ListShowHisData.SetHeaderFontHW(16,0); //设置头部字体高度,和宽度,0表示缺省,自适应
m_ListShowHisData.SetHeaderBKColor(180,180,255,0); //设置头部背景色
m_ListShowHisData.InsertColumn(0,_T("DTU编号"),LVCFMT_CENTER,100);
m_ListShowHisData.InsertColumn(1,_T("通道编号"),LVCFMT_CENTER,80);
m_ListShowHisData.InsertColumn(2,_T("日期"),LVCFMT_CENTER,110);
m_ListShowHisData.InsertColumn(3,_T("时间"),LVCFMT_CENTER,80);
AfxOleInit();
_bstr_t bstrSQL = "select * from YSDATA order by 通道编号 desc";
FindDataFormAccess(bstrSQL);
}
但第二次查询时就出错
//查询数据
void CDlgShowHistoryData::OnBtnQuery()
{
// TODO: Add your control notification handler code here
CTime tTime;
tTime = CTime::GetCurrentTime();
CString str;
CString strTemp1,strTemp2,strTemp3;
strTemp1.Format("%4d-",tTime.GetYear());
if (tTime.GetMonth() > 9)
{
strTemp2.Format("%2d-",tTime.GetMonth());
}
else
{
strTemp2.Format("%d-",tTime.GetMonth());
}
if (tTime.GetDay() > 9)
{
strTemp3.Format("%2d",tTime.GetDay());
}
else
{
strTemp3.Format("%d",tTime.GetDay());
}
str = strTemp1 + strTemp2 + strTemp3;
strTemp1 = "select * from YSDATA where 日期 = '"+str+"'";//order by 通道编号 desc
_bstr_t bstrSQL = (_variant_t)strTemp1;// "select * from YSDATA where 日期 = 'str' order by 通道编号 desc";
m_ListShowHisData.DeleteAllItems();
FindDataFormAccess(bstrSQL);
}
弹出错误提示为
错误的位置在执行 m_pRecordset->Open(bstrSQL,_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
这一句,但是为什么第一次执行就可以,两者之间的差别就是执行的SQL命令不一样。请各位高手帮忙分析一下原因,怎么修改,谢谢各位了。