ADO MFC SQL2000
对于初学VC的朋友来说,连接数据库其实是一件不容易的事情。记得我当时为了与数据库连接上,找了好多资料,上网看了好多文章,都没有解决这个问题。后 来,有个网友帮我解决了,我再次表示感谢。为了后来VC初学的朋友的方便,我现在将VC连接SQL2000数据库的方法写下来,就算你是初学,即使刚入 门,也可以成功连接数据库的。
(注意:由于文章过长,本文章未写完,如果想要整个的代码,可以留个邮箱,或发邮件到yinfulin888888@qq.com索要)
先做点准备工作吧。
1学VC连接数据库,要安装两个软件,Visual C++6.0和SQL2000。怎么安装,我不说了。
2要连接数据库先要启动SQL2000的服务器,看下图吧

单击开始,就可以启动了。
3然后,还是上面,打开“企业管理器”,要建立数据库和表了。打开根目录后,有个
(local)(WindowsNT)的,在上面单击右键,选择属性,再选择安全性,身份验证选择上面那个SQL Server和Windows,再确定,是。等一下就好了。
4建立数据库,在“数据库”根目录上,单击右键,选择“新建数据库”,输入数据库名字
db_client(也可以用其他的名字,但是下面有些地方会用到),展开db_client,在“表”上右键单击,选择“新建表”,建立如下表:

完成之后,直接关闭,提示保存,选择“是”,然后填入表名字,tb_user,即可。然后在表中填入数据。右键单击刚建立的表tb_user,选择“打开表”,“返回所以行”,填入数据,(为了方便登录,第一行都输入1吧)。这样表就建立好了。
5现在要开始正式编程了。打开VC6.0.
选择“文件”,“新建”,“工程”,MFC AppWizard(exe),工程名字为:Client,路径自己选择一下吧。第一步,选择“对话框应用程序”,直接“完成”。
6现在要开始写程序了,
先新建一个类吧,“Insert”,“New class”,classicType 选择:Generic Classic,Name为:CADO,
OK即可。ADO.h文件的代码如下:
#if !defined(AFX_ADO_H__9B5E5042_244A_4558_A0EA_DECC024DB191__INCLUDED_)
#define AFX_ADO_H__9B5E5042_244A_4558_A0EA_DECC024DB191__INCLUDED_
#include "stdafx.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADO
{
public:
_RecordsetPtr m_pRecordset;//定义记录集指针
_ConnectionPtr m_pConnection;//定义连接指针
public:
void GetData(CString strSQL,CString UserID);
CString m_UserID;//用户ID
CString m_UserPwd;//用户密码
CString m_UserType;//用户类型
// bool Test(CString SQL);
void rstOpen(CString TSQL);//打开记录集
void ExecuteSQL(CString SQL);//执行SQL语句
bool Move(int nRecordNum);//移动记录集
CString GetFieldValue(CString Field);//获得字段值
void GetErrors(_com_error eErrors);//获得错误信息
bool Open(CString srecordset,UINT adCmd);//打开记录集
int GetRecordCount();//获得记录个数
bool MoveFirst();//最开始一条
bool MoveNext();//下一条
bool MoveLast();//最后一条
bool MovePrevious();//前一条
void close();//关闭连接和记录集
ADO();
virtual ~ADO();
};
#endif // !defined(AFX_ADO_H__9B5E5042_244A_4558_A0EA_DECC024DB191__INCLUDED_)
ADO.cpp文件代码为:
#include "stdafx.h"
#include "Client.h"
#include "ADO.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ADO::ADO() //构造ADO对象时候自动调用打开连接
{
::CoInitialize(NULL);//初始化
try
{
m_pConnection.CreateInstance(_uuidof(Connection));//建立ADO连接的句柄
_bstr_t strConnect="Provider=SQLOLEDB;data source=127.0.0.1;Database=db_client;uid=sa;pwd=sa;";
//注意:如果你建立数据库时候没有用户名和密码,上面一句该为下面的:
strConnect="Provider=SQLOLEDB;data source=127.0.0.1;Database=db_client;uid=;pwd=;";
m_pConnection->Open(strConnect,"","",0);//打开连接
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
}
ADO::~ADO()
{
}
void ADO::close() //关闭记录集和连接
{
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset=NULL;
m_pConnection=NULL;
::CoUninitialize();
}
bool ADO::MovePrevious() //记录集前一条
{
try
{
m_pRecordset->MovePrevious();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return TRUE;
}
bool ADO::MoveLast() //记录集最后一条
{
try
{
m_pRecordset->MoveLast();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return TRUE;
}
bool ADO::MoveNext()//记录集下一条
{
try
{
m_pRecordset->MoveNext();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return TRUE;
}
bool ADO::MoveFirst() //记录集开始一条
{
try
{
m_pRecordset->MoveFirst();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return TRUE;
}
int ADO::GetRecordCount() //获得记录数目
{
int nCount;
try
{
m_pRecordset->MoveFirst();
}
catch(_com_error e)
{
return 0;
}
if(m_pRecordset->adoEOF)
return 0;
while(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveNext();
nCount++;
}
m_pRecordset->MoveFirst();
return nCount;
}
bool ADO::Open(CString srecordset, UINT adCmd) //打开记录集
{
try
{
//用连接指针打开记录集,可以打开空记录集
m_pRecordset=m_pConnection->Execute((_bstr_t)srecordset,NULL,adCmd);
}
catch(_com_error &e)
{
this->GetErrors(e);
return false;
}
return true;
}
void ADO::GetErrors(_com_error eErrors) //获得错误信息
{
ErrorsPtr pErrors=m_pConnection->GetErrors();
if(pErrors->GetCount()==0)
MessageBox(NULL,eErrors.ErrorMessage(),"错误",MB_OK|MB_ICONEXCLAMATION);
else
{
for(int i=0;i<pErrors->GetCount();i++)//多个错误
{
//获得ADO执行时出错的语言描述,并输出
_bstr_t desc=pErrors->GetItem((long)i)->GetDescription();
MessageBox(NULL,desc,"错误",MB_OK|MB_ICONEXCLAMATION);
}
}
}
CString ADO::GetFieldValue(CString Field) //获得字段值
{
_variant_t Thevalue;
CString temp;
Thevalue=m_pRecordset->GetCollect((_bstr_t)Field);
if(Thevalue.vt==VT_EMPTY || Thevalue.vt==VT_NULL)
temp="";
else
{
temp=(char*)(_bstr_t)Thevalue;
temp.TrimLeft();
temp.TrimRight();
}
return temp;
}
bool ADO::Move(int nRecordNum) //移动记录集指针到指定位置
{
try
{
if(!m_pRecordset->adoBOF)
{
m_pRecordset->MoveFirst();
}
m_pRecordset->Move(nRecordNum);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return TRUE;
}
void ADO::ExecuteSQL(CString SQL) //执行
{
try
{
m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);//用指向连接的指针指向SQL语句
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
}
void ADO::rstOpen(CString TSQL) //打开记录集
{
try
{
//用记录指针打开记录集
_bstr_t strSQL=TSQL.AllocSysString();
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pRecordset->Open(strSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
m_pRecordset=m_pConnection->Execute(_bstr_t(TSQL),NULL,adCmdText);
}
}
void ADO::GetData(CString strSQL,CString UserID)
{
m_pRecordset.CreateInstance(_uuidof(Recordset));//创建记录集对象
m_pRecordset->Open((LPTSTR)strSQL.GetBuffer(130),m_pConnection.GetInterfacePtr()
,adOpenDynamic, adLockOptimistic,adCmdText);//取得表中的记录
//返回各列值
if(m_pRecordset->adoEOF)
{
return ;
}
else
{
m_UserID=UserID;
m_UserPwd=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("user_mm");
m_UserType=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("user_type");
}
}
在StdAfx.h里面加入下面的代码:
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
7下面新建一个对话框,该ID为:IDD_MAINDLG
为该对话框新建一个类,直接在对话框上双击,在弹出的对话框单击OK 输入Name为:CMainDlg
8把第一个对话框ID为: IDD_DIALOG1该为:ID D_LOGINDLG
并设计该对话框为下图:

编辑框控件ID为:IDC_USERID,IDC_USERPWD
按钮控件ID为:IDC_OK,IDC_EXIT
9现在为按钮控件添加消息响应:菜单,“View”,“ClassWiarzd”,“MessageMap ”,“Client”,
“CClientDlg”,IDC_OK,BN_CLICED,Add Function ,OK,OK,
用同样的方法添加IDC_EXIT消息处理。
在CClientDlg的头文件中的某个Public下添加:
int m_count;
ADO adoConn;
在OnExit()的代码如下:
void CClientDlg::OnExit()
{
// TODO: Add your control notification handler code here
int result;
if(m_count>3)
{
CDialog::OnCancel();
}
else
{
result=MessageBox("是否真的要退出","提示",MB_YESNO);
if(IDYES==result) //exit
{
CDialog::OnCancel();
}
else if(IDNO==result) //no
{
m_UserID="";
m_UserPwd="";
UpdateData(FALSE);
GetDlgItem(IDC_USERID)->SetFocus();
}
}
}
另一篇:
(1).在文件stdafx.h中最后一个#endif的前一行写入
#import "C:\program files\common files\System\ado\msado15.dll" no_namespace \
rename("EOF","EndOfFile") \
rename("LockTypeEnum","newLockTypeEnum") \
rename("DataTypeEnum","newDataTypeEnum") \
rename("FieldAttributeEnum","newFieldAttributeEnum") \
rename("EditModeEnum","newEditModeEnum") \
rename("RecordStatusEnum","newRecordStatusEnum") \
rename("ParameterDirectionEnum","newParameterDirectionEnum")
如果你的系统不是安装在C盘的话就把#import 后面的C改成系统所有的盘
--------------------------------------------------------------------------
(2).在C***App类的public:下加入
_RecordsetPtr m_pADOSet;
bool ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL);
在private:下加入
private:
_ConnectionPtr ADOConn;
--------------------------------------------------------------------------
在class C***App : public CWinApp
{
...
};之后#endif之前加入
extern CxxxApp theApp;
--------------------------------------------------------------------------
(3)在BOOL C***App::InitInstance()函数中Enable3dControls(); // Call this when linking
to MFC statically这一行下面加入
if( FAILED(::CoInitialize(NULL)) )
{
AfxMessageBox("ADO Init failed");
return false;
}
try
{
ADOConn.CreateInstance(__uuidof(Connection));
ADOConn->Open("DSN=OBDC数据源;Provider=MSDASQL","用户","密码",
adConnectUnspecified);//这一行要自已修改
}
catch(_com_error &e)
{
CString err;
err.Format("%s", (char*)(e.Description()) );
AfxMessageBox(err);
}
catch(...)
{
AfxMessageBox("Unknown Error...");
}
m_pADOSet.CreateInstance(__uuidof(Recordset));
-------------------------------------------------------------------------
并在文件最后加上如下代码:
bool CxxxApp::ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL)
{
if ( ADOSet->State == adStateOpen) ADOSet->Close();
try
{
ADOSet->Open(strSQL, ADOConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic,
adCmdUnknown);
return true;
}
catch(_com_error &e)
{
CString err;
err.Format("ADO Error: %s",(char*)e.Description());
AfxMessageBox(err);
return false;
}
}
------------------------------------------------------------------------
最后就可以在登录时执行SQL语句了,比如用户为CString strUser, 密码是CString
strPwd;数据库表是user_table(user_id, user_name, user_pwd)则
_variant_t sqlQuery ;
sqlQuery = "select * from user_table where user_name='"+strUser +"' and
user_pwd='"+ strPwd +"'";
theApp.ADOExecute(theApp.m_pADOSet, sqlQuery );
int iCount = theApp.m_pADOSet->GetRecordCount();
if ( 0==iCount )
{
AfxMessageBox(_T("密码错误"), MB_ICONEXCLAMATION);
return;
}
else
{
AfxMessageBox(_T("登录成功"), MB_ICONEXCLAMATION);
}
ADO MFC SQL2000的更多相关文章
- ADO+MFC数据库编程常用语句
设在OnInitDialog()函数中,已经完成了初始化COM,创建ADO连接等操作,即 // 初始化COM,创建ADO连接等操作 if (!AfxOleInit()) { AfxMessageBox ...
- MFC通过ADO操作Access数据库
我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...
- ADO简单封装(MFC)
简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...
- MFC中使用ADO方式连接数据库
文章转自:http://blog.sina.com.cn/s/blog_a43aba5601014z8h.html 一.数据库操作准备 1.导入ADO动态链接库 在工程的stdafx.h中加入如下语句 ...
- MFC,ADO方式实现数据库操作
参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError ...
- VC中使用ADO操作数据库的方法 SQL2000
(1).引入ADO类 #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \ ...
- MFC ADO数据库操作
MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...
- 在MFC里面使用ADO访问微软的ACCESS数据库 实现增删改查
声明:百度以外的公司可以自由转载该文. 正如我上一篇博文提到,ADO这货和MFC没有任何关系,ADO 是一个独立的组件.所以为了使用ADO 我们就要把ADO引入到MFC中. ADO是硬盘上的表现形式是 ...
- VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...
随机推荐
- HTTP报文语法/HTTP组成
一.HTTP报文分类:请求报文和响应报文 请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客户端 请求报文格式: <method> <request-UR ...
- 关于IPv4设置一些常见问题的解答
问:为什么要填IP地址.网关.DNS? 如果是单部机拨号上网,是不需要填这些的.不填,或乱填,对上网都没有任何影响.但是在局域网上网(用路由器就属此环境),就一定要正确设置(手工填写或接受自动分配 ...
- AngularJS源码解析1:angular自启动过程
angularJS加载进来后,会有一个立即执行函数调用,在源代码的最下面是angular初始化的地方.代码展示: bindJQuery(); publishExternalAPI(angular); ...
- Redis存储
redis库提供了两个类:Redis和StrictRedis来实现Redis的命令操作,前者是为了兼容老版本库的集中方法,一般就用StrictRedis 一. redis基本操作 . 设置redis密 ...
- POJ1095 Trees Made to Order(JAVA)
这题用到了卡特兰数,比较麻烦.关于卡特兰数的基本概念百度一下你就知道. 使用卡特兰数对数组元素进行分组之后,需要具体计算一下要求的是第几组的第几个数,然后向下递归. 首先来看利用卡特兰数分组: 从1开 ...
- Laravel5.5 引入并使用第三方类库操作
理论上,Laravel5系列都支持,各位可以一试.我这里使用5.5版本. 我这里引入了一个将汉字转化为拼音的类库测试,一起来看看吧! 首先,在laravel的app目录下自定义一个文件夹,我用的名字是 ...
- OKR 第一阶段
性能优化,主要是为了提高用户体验. 1. 根据浏览器的工作原理,dom树解析时,遇到css 以及js 会出现阻塞,为了缩短dom树解析时间,进行了js 增加 async 的异步加载过程 . 原有代 ...
- 【脚本开发】:性能测试-Java虚拟用户实现下载脚本
方法一,采用java vuer开发 import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.i ...
- 工程手机设置apn
http://android.stackexchange.com/questions/117125/how-do-i-add-an-apn-via-adb xiaomi3 su mount permi ...
- CentOS 7 安装RocketMQ遇到的问题汇总
1.运行broker时提示内存无法分配 解决办法:http://www.bubuko.com/infodetail-2088958.html