对于初学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的更多相关文章

  1. ADO+MFC数据库编程常用语句

    设在OnInitDialog()函数中,已经完成了初始化COM,创建ADO连接等操作,即 // 初始化COM,创建ADO连接等操作 if (!AfxOleInit()) { AfxMessageBox ...

  2. MFC通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  3. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

  4. MFC中使用ADO方式连接数据库

    文章转自:http://blog.sina.com.cn/s/blog_a43aba5601014z8h.html 一.数据库操作准备 1.导入ADO动态链接库 在工程的stdafx.h中加入如下语句 ...

  5. MFC,ADO方式实现数据库操作

    参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError ...

  6. VC中使用ADO操作数据库的方法 SQL2000

    (1).引入ADO类 #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \ ...

  7. MFC ADO数据库操作

    MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...

  8. 在MFC里面使用ADO访问微软的ACCESS数据库 实现增删改查

    声明:百度以外的公司可以自由转载该文. 正如我上一篇博文提到,ADO这货和MFC没有任何关系,ADO 是一个独立的组件.所以为了使用ADO 我们就要把ADO引入到MFC中. ADO是硬盘上的表现形式是 ...

  9. VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法

    1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...

随机推荐

  1. Ubuntu add-apt-repository: command not found

    在Ubuntu下,时不时会有这个错误的. add-apt-repository: command not found 这个是缺少程序,安装一下就可以了.只是不知道安装的名字. 按以下命令走一趟就可以的 ...

  2. LOJ#6047. 「雅礼集训 2017 Day10」决斗(set)

    题面 传送门 题解 这么简单一道题我考试的时候居然只打了\(40\)分暴力? 如果我们把每个点的\(a_i\)记为\(deg_i-1\),其中\(deg_i\)表示有\(deg_i\)个数的\(A_i ...

  3. memcache面试题汇总

    1,memcached是原子的吗? 所有的被发送到memcached的单个命令是完全原子的.如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方.它们将被串行化.先后执行.即 ...

  4. html中文字溢出处理(text-overflow)

    文字溢出处理有两种方式: 一.css overflow:hidden;            white-space: nowrap;            text-overflow: ellips ...

  5. [科普] 借助 everything 扩展教你屏蔽网址或转发网址

    教你屏蔽网址或转发网址 万恶之源 为什么写这篇文章,俺觉得大家应该是有这个需(bai)求(du)的.只是不知道如何操作... 一.屏蔽网址 1.借助系统自带防火墙 (不推荐) Linux 下有 ipt ...

  6. SpringMvc渲染视图

    这篇博文讨论的问题是从ModelAndView如何渲染到页面. 首先要知道每个请求处理完之后都会返回一个ModelAndView对象. 这里我分6种情况来分析,代表6种返回类型: ModelAndVi ...

  7. 支付宝支付下载对账单bug反馈整理

    支付宝官方给广大开发朋友们,留了一个下载账单的API接口,供大家下载指定日期的账单数据.先来看下这个页面: 点我前往官方说明文档 $aop = new AopClient (); $aop->g ...

  8. 架构师养成记--22.客户端与服务器端保持连接的解决方案,netty的ReadTimeoutHandler

    概述 保持客户端与服务器端连接的方案常用的有3种 1.长连接,也就是客户端与服务器端一直保持连接,适用于客户端比较少的情况. 2.定时段连接,比如在某一天的凌晨建立连接,适用于对实时性要求不高的情况. ...

  9. shell-012:批量创建用户

    # #!/bin/bash # 批量创建用户 # 分析:用命令给用户创建密码的方法有两种 # . 可以直接用echo的方法 # echo "abc-123" |passwd roo ...

  10. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...