以下函数执行第二次时出错
定义
_ConnectionPtr pConn1;
_RecordsetPtr pRst1;
初始化
pConn1.CreateInstance("ADODB.Connection"); //初始化Connection指针
pRst1.CreateInstance("ADODB.Recordset");//初始化Recordset指针
m_datagrid为 CDataGridint CAdoDBDlg::OpenTable(CString TableName)
{
try
{
if (!pConn1->State)
pConn1->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;"
"Persist Security Info=False;Initial Catalog=master;Data Source=GZP;"
"User Id=sa;Password=;",
"", "", adConnectUnspecified); CString Strsql="select * from " + TableName;
BSTR bStrsql = Strsql.AllocSysString();
if (pRst1->State !=adStateClosed)
{
m_datagrid.SetRefDataSource(NULL);
pRst1->Close;
}
pRst1->Open(
bStrsql,
_variant_t((IDispatch *) pConn1, true),
adOpenStatic,
adLockReadOnly,
adCmdText);
m_datagrid.SetRefDataSource(NULL);
m_datagrid.SetRefDataSource(pRst1.Detach());
m_datagrid.Refresh();
return(0);
}
catch (_com_error &e)
{
return(-1);
}
}
出错提示为:
First-chance exception in AdoDB.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
定义
_ConnectionPtr pConn1;
_RecordsetPtr pRst1;
初始化
pConn1.CreateInstance("ADODB.Connection"); //初始化Connection指针
pRst1.CreateInstance("ADODB.Recordset");//初始化Recordset指针
m_datagrid为 CDataGridint CAdoDBDlg::OpenTable(CString TableName)
{
try
{
if (!pConn1->State)
pConn1->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;"
"Persist Security Info=False;Initial Catalog=master;Data Source=GZP;"
"User Id=sa;Password=;",
"", "", adConnectUnspecified); CString Strsql="select * from " + TableName;
BSTR bStrsql = Strsql.AllocSysString();
if (pRst1->State !=adStateClosed)
{
m_datagrid.SetRefDataSource(NULL);
pRst1->Close;
}
pRst1->Open(
bStrsql,
_variant_t((IDispatch *) pConn1, true),
adOpenStatic,
adLockReadOnly,
adCmdText);
m_datagrid.SetRefDataSource(NULL);
m_datagrid.SetRefDataSource(pRst1.Detach());
m_datagrid.Refresh();
return(0);
}
catch (_com_error &e)
{
return(-1);
}
}
出错提示为:
First-chance exception in AdoDB.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
都没有Close() 第二次当然出错啦
pRstTemp = pRst1.Detach();
m_datagrid.SetRefDataSource(pRstTemp);
pRstTemp->Close();
pRstTemp = NULL;
if (pRst1->State !=adStateClosed)
{
m_datagrid.SetRefDataSource(NULL);
pRst1->Close;
}to shines(Othelloing) :
用你的方法试了,还是出现同样错误
{
m_datagrid.SetRefDataSource(NULL);
pRst1->Close;
}如果还是有问题,可能m_datagrid已经帮你close了,你试试不close看看。
m_datagrid.SetRefDataSource(pRst1.Detach());
pRst1.Detach会同时把指针pRst1释放掉