ADO访问SQL server数据库时,打开记录集失败,数据库连接正常,以下为相关代码:CADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select * from d_sczk");
m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);
if(!m_AdoConn.m_pRecordset->adoEOF)
{
MessageBox("打开记录集失败!");
}下面是CADOConn.cpp的代码#include "stdafx.h"
#include "ADOConn.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CADOConn::CADOConn()
{}CADOConn::~CADOConn()
{}_RecordsetPtr& CADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
e.Description();
}
return m_pRecordset;
}BOOL CADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
_variant_t RecordsAffected;
try
{
if(m_pConnection==NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSQL,&RecordsAffected,adCmdText);
return TRUE;
}
catch(_com_error e)
{
e.Description();
return FALSE;
}
}void CADOConn::ExitConnect()
{ if(m_pRecordset!=NULL)
m_pRecordset->Close(); m_pConnection->Close();
::CoUninitialize();
}void CADOConn::OnInitADOConn()
{
    ::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=SY;Data Source=20110325-1233\\WINCC";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}}

解决方案 »

  1.   

    if(!m_AdoConn.m_pRecordset->adoEOF)
    {
    MessageBox("打开记录集失败!");
    }这只能说明数据集是空的,不能说明打开记录集失败。其只是说明指针到了数据集末尾之后。
      

  2.   

    我的数据库表有数据啊,下面是我的查询按钮代码,我一点击按钮运行的窗口就消失了void CDayQueryDlg::OnBtn1Query() 
    {
    // TODO: Add your control notification handler code here
    /*CADOConn m_AdoConn;
    CString sql;
    sql.Format("select* from d_sczk");
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);*/
    UpdateData(TRUE);
    CTime temp;
    m_time.GetTime(temp);
    int day;
    day=temp.GetDay();
    int month;
    month=temp.GetMonth();
    int year;
    year=temp.GetYear();
    CString stryear,strmonth,strday;
    stryear.Format("%d",year);
    strmonth.Format("%d",month);
    strday.Format("%d",day);
    //m_adodcday.SetRecordSource("select lm,llz,sjz,wc from d_sczk where year='"+stryear+"' and month='"+strmonth+"' and day='"+strday+"' ");
    m_adodcday.SetRecordSource("select lm,llz,sjz,wc from d_sczk");
    m_adodcday.Refresh();
    m_datagrid.SetRefDataSource(m_adodcday.GetControlUnknown());
    m_datagrid.Refresh();
    }
      

  3.   

    1,这个判断肯定不对:
    if(!m_AdoConn.m_pRecordset->adoEOF)
    {
    MessageBox("打开记录集失败!");
    }
    原因1楼已经说了;
    2,如果你import了msado15.dll这个文件(或者同类文件),假定你已经定义过连接指针:
    _ConnectionPtr m_AdoConn;并在之前已经成功连接了数据库。
    那么你执行sql语句像下面这样更好:_RecordsetPtr m_pRecordset;
    _bstr_t sql(_T(select* from d_sczk));
    _CommandPtr m_pCmd(__uuidof(Command));
    m_pCmd->PutActiveConnection(m_AdoConn.GetInterfacePtr());
    m_pCmd->PutCommandText(sql);
    m_pRecordset=m_pCmd->Execute(NULL, NULL, adCmdText);
    感觉你的代码结构比较混乱,建议参考一下本版置顶帖子的操作数据库写法:
    http://blog.csdn.net/zyq5945/archive/2010/04/29/5541280.aspx
      

  4.   

    另外别忘了加上异常捕获,了解你具体的错误:try
    {
    //带测试的code
    }
    catch (_com_error& e)
    {
    AfxMessageBox(e.Description());
    }
      

  5.   

    首先谢谢大家的指点。
    竹寒雪大侠你好,我的CAOConn是一个自己写的类,用来连接数据库和打开记录集的,m_AdoConn是CAOConn的对象,而且我用try catch试过了,连接数据库的OnInitADOConn()和打开记录集的GetRecordSet(_bstr_t bstrSQL)函数都没有错误信息返回
    我在对话框上插入了ADO DATA控件和DATA GRID控件,我就是想点击查询按钮,让d_sczk(表名)中的lm,llz,sjz,wc这四个字段显示在DATA GRID控件上。
      

  6.   

    你弄的太麻烦了,可以参考一下下面的,把我的demo修改一下就能实现你的要求,基本上不用写代码(实际上就是一条sql语句再配一下datagrid列绑定):
    http://blog.csdn.net/zxhx/archive/2011/03/28/6283234.aspxsql server连接的字符串可以通过data control配置向导自动生成
      

  7.   

    如果不需要运行初始化datagrid时显示字段,可以在button的onclick上配datagrid的绑定代码