最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

VC++环境下连接SQL Server数据库方法指导

来源:动视网 责编:小OO 时间:2025-09-25 07:12:50
文档

VC++环境下连接SQL Server数据库方法指导

VC++环境下连接SQLServer数据库方法指导实验课时:4课时实验类型:设计型实验方式:集中一、实验环境1.WindowsXP操作系统;2.VC++6.0开发环境;3.SQLserver2000数据库管理系统。二、实验内容和要求利用VC开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。三、实验原理VC访问SQLServer数据库,常用的方法有两种:通过ODBC连接和通过ADO连接。下面分别介绍一下。采用ODBC方式要求先创建ODBC数据源,应用程序通过数据源与数据
推荐度:
导读VC++环境下连接SQLServer数据库方法指导实验课时:4课时实验类型:设计型实验方式:集中一、实验环境1.WindowsXP操作系统;2.VC++6.0开发环境;3.SQLserver2000数据库管理系统。二、实验内容和要求利用VC开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。三、实验原理VC访问SQLServer数据库,常用的方法有两种:通过ODBC连接和通过ADO连接。下面分别介绍一下。采用ODBC方式要求先创建ODBC数据源,应用程序通过数据源与数据
VC++环境下连接SQL Server数据库方法指导

实验课时:4课时

实验类型:设计型

实验方式:集中

一、实验环境

1.Windows XP操作系统;

2.VC++6.0开发环境;

3.SQL server 2000数据库管理系统。

二、实验内容和要求

利用VC开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。

三、实验原理

VC访问SQL Server数据库,常用的方法有两种:通过ODBC连接和通过ADO连接。下面分别介绍一下。

采用ODBC方式要求先创建ODBC数据源,应用程序通过数据源与数据库连接;并且在创建应用程序时,只能是基于单文档或多文档,而无法直接创建基于对话框的应用程序。

采用ADO方式无需创建数据源,应用程序可通过ADO直接与数据库连接;ADO方式可以创建基于对话框的应用程序。

两种方式都要在应用程序中添加代码以完成相应的初始化功能。

四、实验步骤

下面通过两个例子分别介绍基于ODBC方式和基于ADO方式的实验步骤。

1 基于ODBC方式的实验步骤

(1)在SQL Server2000中创建数据库student,该数据库中有学生表s用来存放学生信息。s表的结构如下:

属性名类型是否为主键允许空备注
snochar(8)学号
snamevarchar(10)姓名
ageint年龄
deptchar(4)所在系号
commentvarchar(8)评语
 s表的创建方法在此不详述。

(2)创建ODBC数据源

“开始”--〉“设置”--〉“控制面板”—〉“管理工具”—〉“数据源(ODBC)”,打开之后出现如图1所示窗口。

图1

点击“添加”按钮,出现图2。

图2

选择SQL Server,点击“完成”,出现图3。

图3

名称中填写所创建的数据源的名称,本例中为student,描述可以不填。因为SQL Server的服务器和客户端均安装在本地计算机上,所以服务器为(local)。如果本地计算机上只安装了客户端,服务器安装在另外的机器上,服务器为另一台机器的名称。

点击“下一步”,出现图4。

图4

SQL Server如何验证ID的真伪,使用哪种方法要看安装SQL Server2000时选择的是哪种验证方式。如果是Windows验证,选择使用网络登录ID的Windows NT验证;如果是混合验证模式则要选择下面一种。本例中采用Windows验证。进入数据库无需另外的用户名和密码。

点击“下一步”,出现图5。

图5

这里要更改默认的数据库,默认情况下数据源所连接的数据库为master,这里要改为student数据库。

点击“下一步”,出现图6。

图6

这里无需修改,点击“完成”出现图7。

图7

点击“测试数据源”,如果测试成功说明数据源已成功创建。

(3)创建VC应用程序。

打开VC++6.0,新建工程,如图8所示。选择MFC AppWizard(exe),工程名为exec1,存放在D盘实验文件夹里。

图8

点击“确定”,在出现的窗口中选择“单文档”,点击“下一步”,出现图9。

图9

这里选择“查看数据库不使用文件支持”,还要选择数据源,点击“数据源…”,弹出如图10所示窗口。

图10

选择“student”数据源,点击“OK”,在弹出的窗口中选择表dbo.s,点击“OK”返回图9所示的界面。以后的创建步骤中没有需要修改的地方可以直接点击完成。这样工程exec1就创建完成了,并且通过数据源与数据库发生了关联。

创建好的工程可以运行,结果如图11所示。

图11

(4)界面设计

在工作区左边的树型结构中,选择ResourceView,展开Dialog节点,双击IDD_EXEC1_FORM,打开该对话框。在这里添加所需控件。如图12所示。

图12

此时运行程序,结果如图13所示。

图13

从界面可以看出程序要完成的功能。完整的程序运行后,界面默认显示表中的第一条数据,点击工具栏中的“下一记录”可以显示下一条记录;点击“删除”按钮可将当前显示的数据从库中删除;点击“清除”按钮,将所有编辑框清空;在界面输入学生信息,点击“添加”按钮可将此学生信息输入至数据库;点击“修改”按钮可修改当前显示的学生信息。

为界面上的编辑框和按钮添加变量和函数。在界面右键单击,选择“建立类向导”,弹出如图14所示窗口。

图14

本例中需要为编辑框IDC_AGE, IDC_COMMENT, IDC_DEPARTMENT, IDC_NAME, IDC_SNO添加变量。以IDC_AGE为例,点击“ADD Variable”弹出如图15所示窗口。

图15

在下拉框中选择m_pSet->m_age为变量名,这里的变量是与数据库表s中的字段相对应的,变量类型也与s中的字段类型对应。其它变量的添加方法相同。

为按钮添加函数比较简单,双击按钮即可。添加的函数在exec1View.cpp文件中。

(5)代码设计

“清除”按钮所添加的函数为OnClear(),具体代码如下:

//名称:OnClear

//功能:清除编辑框中的内容

void CExec1View::OnClear() 

{

    CWnd* c1;

    c1= CWnd::GetDlgItem(IDC_SNO);//获得编辑框

    c1->SetWindowText(""); //将编辑框置空

    c1= CWnd::GetDlgItem(IDC_NAME);

c1->SetWindowText("");

    c1= CWnd::GetDlgItem(IDC_DEPARTMENT);

c1->SetWindowText("");

    c1= CWnd::GetDlgItem(IDC_AGE);

c1->SetWindowText("");

    c1= CWnd::GetDlgItem(IDC_COMMENT);

    c1->SetWindowText("");         

}

“添加”按钮所添加的函数为OnAdd(),具体代码如下:

//名称:OnAdd

//功能:插入一条记录

void CExec1View::OnAdd() 

{

// TODO: Add your control notification handler code here

    //判断年龄是否合适

    CString strAge;

GetDlgItem(IDC_AGE)->GetWindowText(strAge);

    int nAge = atoi(strAge.GetBuffer(0));

if(nAge<0 || nAge>120)

    {

        AfxMessageBox("输入的年龄不符合实际!");

        return;

    }

    //呈增加状态

m_pSet->AddNew();

    UpdateData();

    //更新数据库

m_pSet->Update();

    //重新获得数据

m_pSet->Requery();

    UpdateData(FALSE);    

}

“删除”按钮所添加的函数为OnDelete(),具体代码如下:

//名称:OnDelete

//功能:删除当前记录

void CExec1View::OnDelete() 

{

    // TODO: Add your control notification handler code here

    //发出删除命令

m_pSet->Delete();

    //重新获得记录集

m_pSet->Requery();

    UpdateData(FALSE);        

}

“修改”按钮所添加的函数为OnEdit(),具体代码如下:

//名称:OnEdit

//功能:修改当前记录

void CExec1View::OnEdit() 

{

    // TODO: Add your control notification handler code here

    //判断年龄是否合适

    CString strAge;

GetDlgItem(IDC_AGE)->GetWindowText(strAge);

    int nAge = atoi(strAge.GetBuffer(0));

if(nAge<0 || nAge>120)

    {

        AfxMessageBox("输入的年龄不符合实际!");

        return;

    }

    //呈编辑状态

m_pSet->Edit();

    UpdateData();

    //更新数据库

m_pSet->Update();

    //重新获得记录集

m_pSet->Requery();

    UpdateData(FALSE);    

}

(6)运行结果

图16

2基于ADO方式的实验步骤

此例中所用数据库与上例中相同;

此例中无需创建数据源。

(1)创建VC应用程序

打开VC++6.0,新建工程。选择MFC AppWizard(exe),工程名为exec2,存放在D盘实验文件夹里。点击“确定”,在弹出的窗口中选择“基本对话框”,以后的步骤没有需要修改的地方,可以直接点击“完成。”这样一个基于基本对话框的工程就创建好了。

(2)界面设计

在工作区左边的树型结构中,选择ResourceView,展开Dialog节点,双击IDD_EXEC2_DIALOG,打开该对话框。在这里添加所需控件。如图17所示。

图17

为编辑框和列表框添加变量。在界面右键单击,选择“建立类向导”,弹出如图18所示窗口。

图18

本例中需要为编辑框IDC_AGE, IDC_COMMENT, IDC_DEPT, IDC_NAME, IDC_SNO,列表框IDC_LIST添加变量。以IDC_AGE为例,点击“ADD Variable”弹出如图19所示窗口。

图19

这里变量名为m_age,类型可从下拉框里选。添加变量完成之后类向导如图20所示。

图20

为按钮添加函数,双击按钮可为其添加函数,在exec2Dig.cpp文件里。

(3)与ADO相关的代码设计

引入ADO库文件,使用ADO前必须在工程的StdAfx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

//加入ADO支持库

#import "c:\\program files\\common files\\system\\ado\\msado15.dll" \

    no_namespace \

    rename ("EOF", "adoEOF")   

定义ADO连接变量指针,在exec2.h文件的class CExec2App : public CwinApp方法中添加代码如下:

    // 定义ADO连接变量指针

    _ConnectionPtr    m_pConnection;

该指针为整个应用程序共享,所以放在public下面。

定义ADO连接、命令、记录集变量指针,在exec2Dlg.h文件的class CExec2Dlg : public CDialog方法中添加如下代码:

    // 定义ADO连接、命令、记录集变量指针

    _ConnectionPtr    m_pConnection;

    _CommandPtr        m_pCommand;

    _RecordsetPtr    m_pRecordset;

该指针为整个应用程序共享,所以放在public下面。

初始化OLE/COM库环境。必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

在本例中,在exec2.cpp文件的BOOL CExec2App::InitInstance()成员函数里添加如下代码:

//初始化COM,创建ADO连接等操作

    AfxOleInit();

    m_pConnection.CreateInstance(__uuidof(Connection));

    //在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

    //因为它有时会经常出现一些想不到的错误

    try                 

    {    

        //打开本地 Sql Server库student

                                     m_pConnection->Open("driver={SQL Server}; Server=lenovo-pc;Database=student;UID="";PWD=""

            "

        //Server后是服务器的计算机名,Database后是数据库名

//这里使用的windows验证,没有设置用户名和密码,

        //如果是windows和SQL server混合验证,UID="";PWD=""要写入相应的用户名和密码

    }

    catch(_com_error e)

    {

        AfxMessageBox("数据库连接失败!");

        return FALSE;

    } 

在exec2Dlg.cpp文件中添加代码。

在#endif下面添加如下代码:

 extern CExec2App theApp;       // 在此引用应用类中的theApp来获取库连接指针

在BOOL CExec2Dlg::OnInitDialog()函数中添加如下代码:

// TODO: Add extra initialization here

    //使用ADO创建数据库记录集

    m_pRecordset.CreateInstance(__uuidof(Recordset));

    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

    // 因为它有时会经常出现一些想不到的错误

    try

    {

        m_pRecordset->Open("SELECT * FROM s",                // 查询s表中所有字段

                            theApp.m_pConnection.GetInterfacePtr(),     // 获取库接库的IDispatch指针

                            adOpenDynamic,

                            adLockOptimistic,

                            adCmdText);

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }

至此,与ADO相关的代码都已添加完了。下面在exec2Dlg.cpp文件中添加应用代码。

(4)与功能相关的代码设计

在界面上用到列表框,当鼠标点击列表框的某一行时,其中的数据能够在编辑框中显示出来,这要用到列表框的一个函数。添加此函数的方法如下:摁住Ctrl和w键,进入类向导,如图21所示。

图21

选择IDC_LIST,在右边的Messages下面选择LBN_SELCHANGE,然后点击“Add Function”按钮,最后点击“确定”按钮,即为列表框添加了此函数。具体代码如下:

//名称:OnSelchangeList

//功能:当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来

void CExec2Dlg::OnSelchangeList() 

{

    int curSel = m_list.GetCurSel();        

    _variant_t var,varIndex;

if(curSel < 0)

        return;

    try

    {

        // 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针

        m_pRecordset->MoveFirst();

        m_pRecordset->Move(long(curSel));

        

        var = m_pRecordset->GetCollect("sname");

        if(var.vt != VT_NULL)

            m_sname = (LPCSTR)_bstr_t(var);

        var = m_pRecordset->GetCollect("age");

        if(var.vt != VT_NULL)

            m_age=(LPCSTR)_bstr_t(var);

        var = m_pRecordset->GetCollect("sno");

        if(var.vt != VT_NULL)

            m_sno = (LPCSTR)_bstr_t(var);

        var = m_pRecordset->GetCollect("dept");

        if(var.vt != VT_NULL)

            m_dept = (LPCSTR)_bstr_t(var);

        var = m_pRecordset->GetCollect("comment");

        if(var.vt != VT_NULL)

            m_comment = (LPCSTR)_bstr_t(var);

        UpdateData(false);

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }

}

将数据库中的数据显示在列表框中,添加函数ListData()。添加的方法是,在工作区左边的树型结构中,选择ClassView,右键单击CExec2Dlg,在弹出的菜单中选择Add Member Function,出现如图22所示的窗口,类型为void,函数描述为ListData()。

图22

此函数的具体代码如下:

//名称:ListData

//功能:将数据库中的数据显示在列表框中

void CExec2Dlg::ListData()

{

    _variant_t var;

    CString strname,strage,strsno,strdept,strcom;

    

    //清空列表框

    m_list.ResetContent();

    strname=strage=strsno=strdept=strcom="";

    

    //在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

    //因为它有时会经常出现一些想不到的错误。

    try

    {

        if(!m_pRecordset->BOF)

            m_pRecordset->MoveFirst();

        else

        {

            AfxMessageBox("表内数据为空");

            return;

        }

    

        // 读入库中各字段并加入列表框中

        while(!m_pRecordset->adoEOF)

        {

            var = m_pRecordset->GetCollect("sno");

            if(var.vt != VT_NULL)

                strsno = (LPCSTR)_bstr_t(var);

            var = m_pRecordset->GetCollect("sname");

            if(var.vt != VT_NULL)

                strname = (LPCSTR)_bstr_t(var);

            var = m_pRecordset->GetCollect("age");

            if(var.vt != VT_NULL)

                strage = (LPCSTR)_bstr_t(var);

            

            var = m_pRecordset->GetCollect("dept");

            if(var.vt != VT_NULL)

                strdept = (LPCSTR)_bstr_t(var);

            var = m_pRecordset->GetCollect("comment");

            if(var.vt != VT_NULL)

                strcom = (LPCSTR)_bstr_t(var);

            m_list.AddString( strsno + " --> " +strname + " --> "+strage+ " --> "+ strdept+ " --> "+ strcom);

            

            m_pRecordset->MoveNext();

        }

        

        // 默认列表指向第一项,同时移动记录指针并显示

        m_list.SetCurSel(0);

        OnSelchangeList();

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }

}

插入按钮对应的函数代码如下:

//名称:OnWritedata

//功能:将编辑框中输入的学生信息插入到s表中

void CExec2Dlg::OnWritedata() 

{

    UpdateData();

    if(m_sname == "" || m_sno == "")

    {

        AfxMessageBox("学号和姓名信息不能为空!");

        return;

    }

    

    //在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

    //因为它有时会经常出现一些想不到的错误。

    try

    {

        // 写入各字段值

        m_pRecordset->AddNew();

        m_pRecordset->PutCollect("sno", _variant_t(m_sno));

        m_pRecordset->PutCollect("sname", _variant_t(m_sname));

        m_pRecordset->PutCollect("age", atol(m_age));

        m_pRecordset->PutCollect("dept", _variant_t(m_dept));

        m_pRecordset->PutCollect("comment", _variant_t(m_comment));

        m_pRecordset->Update();

        AfxMessageBox("插入成功!");

        // 更新显示其库内容

        int nCurSel = m_list.GetCurSel();

        ListData();

        m_list.SetCurSel(nCurSel);

        // 移动记录指针到新的位置

        OnSelchangeList();

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }

    

}

修改按钮对应的函数代码如下:

//名称:OnModify

//功能:修改学生信息

void CExec2Dlg::OnModify() 

{

    UpdateData();        // 更新对话框数据

    if(m_list.GetCount() == 0)

    {

        AfxMessageBox("表中记录数为空!");

        return;

    }

else if(m_list.GetCurSel() < 0 || m_list.GetCurSel() > m_list.GetCount())

        m_list.SetCurSel(0);

    // 修改当前记录的字段值

    try

    {

        m_pRecordset->PutCollect("sno", _variant_t(m_sno));

        m_pRecordset->PutCollect("sname", _variant_t(m_sname));

        m_pRecordset->PutCollect("age", atol(m_age));

        m_pRecordset->PutCollect("dept", _variant_t(m_dept));

        m_pRecordset->PutCollect("comment", _variant_t(m_comment));

        m_pRecordset->Update();

        // 重新读入库记录更新显示

        int nCurSel = m_list.GetCurSel();

        ListData();

        m_list.SetCurSel(nCurSel);

        // 移动记录指针到新的位置

        OnSelchangeList();

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }    

}

删除按钮对应的函数代码如下:

//名称:OnDelete

//功能:删除选中的学生信息

void CExec2Dlg::OnDelete() 

{

    if(m_list.GetCount() == 0)

        return;

else if(m_list.GetCurSel() < 0 || m_list.GetCurSel() > m_list.GetCount())

        m_list.SetCurSel(0);

    try

    {

        // 删除当前行记录

        m_pRecordset->Delete(adAffectCurrent);

        m_pRecordset->Update();

        // 删除列表中当前值

        int nCurSel = m_list.GetCurSel();

        m_list.DeleteString(nCurSel);

        if(nCurSel == 0 && (m_list.GetCount() != 0))

            m_list.SetCurSel(nCurSel);

        else if(m_list.GetCount() != 0)

            m_list.SetCurSel(nCurSel-1);

        

        // 移动记录指针到新的位置

        OnSelchangeList();

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }    

}

查询按钮对应的函数代码如下:

//名称:OnQuery() 

//功能:按照学号和姓名查询学生信息,如果只输入学号则只按照学号查询

//只输入姓名则只按照姓名查询,两者都没有输入则查询所有学生信息

void CExec2Dlg::OnQuery() 

{

    UpdateData(TRUE);

    //构造Sql语句

    //为简单考虑,这里只把学号和姓名作为查询条件

    CString strSql;

    if(m_sname != "" && m_sno != "")

        strSql.Format("SELECT * FROM s WHERE sname = '%s' AND sno = '%s'

        m_sname,m_sno);

    else if(m_sname != "" && m_sno == "")

        strSql.Format("SELECT * FROM s WHERE sname = '%s'",m_sname);

    else if(m_sname == "" && m_sno != "")

        strSql.Format("SELECT * FROM s WHERE sno = '%s'",m_sno);

    else

        strSql = "SELECT * FROM s";

    try

    {

        //先关闭已经打开的记录集对象

        m_pRecordset->Close();

        //根据新的Sql查询语句,重新打开记录集对象

        m_pRecordset->Open(strSql.AllocSysString(),                

                           theApp.m_pConnection.GetInterfacePtr(),

                           adOpenDynamic,

                           adLockOptimistic,

                           adCmdText);

    }

    catch(_com_error *e)

    {

        AfxMessageBox(e->ErrorMessage());

    }

    //将查询后得到的新记录集显示出来

    ListData();    

}

刷新按钮对应的函数代码如下:

//名称:OnRefresh

//功能:刷新编辑框和列表框

void CExec2Dlg::OnRefresh() 

{

    m_sno="";

    m_sname="";

    m_age="";

文档

VC++环境下连接SQL Server数据库方法指导

VC++环境下连接SQLServer数据库方法指导实验课时:4课时实验类型:设计型实验方式:集中一、实验环境1.WindowsXP操作系统;2.VC++6.0开发环境;3.SQLserver2000数据库管理系统。二、实验内容和要求利用VC开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。三、实验原理VC访问SQLServer数据库,常用的方法有两种:通过ODBC连接和通过ADO连接。下面分别介绍一下。采用ODBC方式要求先创建ODBC数据源,应用程序通过数据源与数据
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top