zoukankan      html  css  js  c++  java
  • ADO MFC SQL2000

    对于初学VC的朋友来说,连接数据库其实是一件不容易的事情。记得我当时为了与数据库连接上,找了好多资料,上网看了好多文章,都没有解决这个问题。后 来,有个网友帮我解决了,我再次表示感谢。为了后来VC初学的朋友的方便,我现在将VC连接SQL2000数据库的方法写下来,就算你是初学,即使刚入 门,也可以成功连接数据库的。

     (注意:由于文章过长,本文章未写完,如果想要整个的代码,可以留个邮箱,或发邮件到yinfulin888888@qq.com索要)

             先做点准备工作吧。

    1学VC连接数据库,要安装两个软件,Visual C++6.0和SQL2000。怎么安装,我不说了。

    2要连接数据库先要启动SQL2000的服务器,看下图吧

            VC连接SQL2000数据库 - yinfulin2008 - yinfulin2008似水年华

             单击开始,就可以启动了。

    3然后,还是上面,打开“企业管理器”,要建立数据库和表了。打开根目录后,有个

    (local)(WindowsNT)的,在上面单击右键,选择属性,再选择安全性,身份验证选择上面那个SQL Server和Windows,再确定,是。等一下就好了。

    4建立数据库,在“数据库”根目录上,单击右键,选择“新建数据库”,输入数据库名字

    db_client(也可以用其他的名字,但是下面有些地方会用到),展开db_client,在“表”上右键单击,选择“新建表”,建立如下表:

    VC连接SQL2000数据库 - yinfulin2008 - yinfulin2008似水年华

    完成之后,直接关闭,提示保存,选择“是”,然后填入表名字,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 FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")

     

    7下面新建一个对话框,该ID为:IDD_MAINDLG

    为该对话框新建一个类,直接在对话框上双击,在弹出的对话框单击OK 输入Name为:CMainDlg

    8把第一个对话框ID为: IDD_DIALOG1该为:ID D_LOGINDLG

    并设计该对话框为下图:

    VC连接SQL2000数据库 - yinfulin2008 - yinfulin2008似水年华

    编辑框控件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 filescommon filesSystemadomsado15.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); 
    }

  • 相关阅读:
    OpenGL, Net 2005, error C2381: 'exit' : redefinition; __declspec(noreturn) differs
    24点游戏
    一个3*3的格子,给定n>=10, 将[1,n]中的数填入方格中,使得相邻方格的数的和为质数
    最大子矩阵问题 PKU 1050
    12年9月12日
    再谈MSDN Library For Visual Studio 2010
    漫谈.NET开发中的字符串编码
    《.NET 4.0网络开发入门之旅》4:与Socket的第一次“约会”
    “.NET 4.0 网络开发入门之旅系列文章”—— IP 知多少?(下)
    C#之int挑战Java之Integer
  • 原文地址:https://www.cnblogs.com/Ricezhang/p/3762732.html
Copyright © 2011-2022 走看看