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());
}}
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());
}}
{
MessageBox("打开记录集失败!");
}这只能说明数据集是空的,不能说明打开记录集失败。其只是说明指针到了数据集末尾之后。
{
// 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();
}
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
{
//带测试的code
}
catch (_com_error& e)
{
AfxMessageBox(e.Description());
}
竹寒雪大侠你好,我的CAOConn是一个自己写的类,用来连接数据库和打开记录集的,m_AdoConn是CAOConn的对象,而且我用try catch试过了,连接数据库的OnInitADOConn()和打开记录集的GetRecordSet(_bstr_t bstrSQL)函数都没有错误信息返回
我在对话框上插入了ADO DATA控件和DATA GRID控件,我就是想点击查询按钮,让d_sczk(表名)中的lm,llz,sjz,wc这四个字段显示在DATA GRID控件上。
http://blog.csdn.net/zxhx/archive/2011/03/28/6283234.aspxsql server连接的字符串可以通过data control配置向导自动生成