以下函数执行第二次时出错
定义 
 _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.

解决方案 »

  1.   

    补充:是ado访问Sql Server数据库
      

  2.   

    补充:是ado访问Sql Server数据库
      

  3.   

    pRst1->Open()
    都没有Close() 第二次当然出错啦
      

  4.   

    不知道pRst1.Detach()算不算Close()我觉得应该这样,也许可以:_RecordsetPtr  pRstTemp;
    pRstTemp = pRst1.Detach();
    m_datagrid.SetRefDataSource(pRstTemp);
    pRstTemp->Close();
    pRstTemp = NULL;
      

  5.   

    执行到此处就出错了
    if (pRst1->State !=adStateClosed) 
          {        
           m_datagrid.SetRefDataSource(NULL);   
       pRst1->Close;
          }to  shines(Othelloing) :
    用你的方法试了,还是出现同样错误
      

  6.   

    用了我的方法,前面就不用这段代码了:if (pRst1->State !=adStateClosed) 
          {        
           m_datagrid.SetRefDataSource(NULL);   
       pRst1->Close;
          }如果还是有问题,可能m_datagrid已经帮你close了,你试试不close看看。
      

  7.   

    找到原因了,此句
    m_datagrid.SetRefDataSource(pRst1.Detach());  
    pRst1.Detach会同时把指针pRst1释放掉