VisualStudio 2008连接SQLServer 2005 Express数据库

本文详细介绍了如何使用Visual Studio 2008连接到SQL Server 2005 Express数据库,包括安装Visual Studio和SQL Server管理工具,配置SQL Server网络协议,创建数据库和用户,以及开发C++数据库接口的步骤。同时强调了在数据库操作中异常处理的重要性。
由于工作需要,前段时间重新实现了下使用VisualStudio、SQLServer实现简单的数据库访问的小程序,整个过程并不复杂,但是还是踩了不少坑,现在把过程贡献出来,供初学者参考。
整个实现流程大致分为:安装VisualStudio、SQLServer Management Studio软件、配置SQLServer、创建数据库并适配C++代码三部分。其中SQLServer用VisualStudio安装时顺带安装的Express版本就行。

1. 安装VisualStudio。
这个过程基本就是不断“下一步”的过程,建议初学者选择“完全安装”模式。
2. 安装SQLServer 管理工具:SQLServer Management Studio;
3. 配置SQLServer:
3.1. SQLServer网络配置。
开始\Microsoft SQL Server 2005\配置工具\SQL Server Configuration Manager,打开如下界面,启用Name Pipes、TCP/IP协议:
协议配置
3.2. 配置SQLServer:
3.2.1.开始\Microsoft SQL Server 2005\SQL Server Managerment Studio Express,首次使用“Windows身份认证”,点击“连接”后进入管理界面。
SQLServer管理端首次登录
3.2.2.创建数据库:右键左树中的“数据库”项,选择“新建数据库”,如下图创建名为ATMServer的数据库。
创建数据库
3.2.3.增加用户:展开左树中的“安全性”节点,右键“登录名”节点,选择“新建登录名”,在弹出窗口中配置新用户的用户名、密码、默认数据库信息。
创建登录名

注:这里也可以先创建用户名,然后使用新创建的用户名登录管理系统后,再创建数据库。
3.2.4.在新创建的数据库ATMServer中,创建数据表。
数据表
3.2.5.配置数据库属性,使数据库可远程访问。
右键左树中的数据库引擎(根节点),选择“属性”,在打开的窗口中,配置数据库远程访问的用户。
远程访问用户

配置用户权限

这里写图片描述

3.2.6 启动数据库服务。
开始\Microsoft SQL Server 2005\配置工具\SQL Server Configuration Manager,启动数据库服务。

启动数据库服务4.开发C++接口:
4.1. 在本次开发中,为了使用方便,将数据库访问接口和数据库库访问的底层接口封装在一个类中,实际使用中,建议将底层接口单独封装。代码如下:

// DBAdp.h
// DBAdp为数据库访问接口的封装,其私有成员函数为数据库基本操作接口

#pragma once


#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

struct ACOUNT_INFO 
{
    CString m_csAcntNO;
    CString m_csUsrID;
    CString m_csBalance;
    CString m_csPasswd;
};

struct CSTM_INFO
{
    CString m_csID;
    CString m_csName;
    CString m_csMobile;
    CString m_csSex;
    CString m_csCmpny;
};

class CDBAdp
{
public:
    CDBAdp(void);
    ~CDBAdp(void);

    int addNewAcount(const ACOUNT_INFO &oAcntInfo);
    int addNewCstmInfo(const CSTM_INFO &oCstomInfo);

    int queryAcountInfoByAcntNO(ACOUNT_INFO &oAcntInfo);

    int updateAcountInfo(const ACOUNT_INFO &oAcntInfo);

private:

    // 插入操作基本接口
    int insert(const CString &csTblName, const CString &csParLst, const CString &csData);
    // 查询操作基本接口
    int select(const CString &csTblName, const CString &csCnd);

    // 修改操作基本接口
    int update(const CString &csTblName, const CString &csData, const CString &csCnd);

    // 初始化函数
    int onInit();

private:
    _ConnectionPtr m_pConPtr;
    _RecordsetPtr m_pRcrdSet;

    CString m_csConnection;
};

4.2. 数据库接口类实现

#include "StdAfx.h"
#include "DBAdp.h"

CDBAdp::CDBAdp(void)
{
    (void)onInit();
}

CDBAdp::~CDBAdp(void)
{
}

int CDBAdp::onInit()
{
    CoInitialize(NULL);
    HRESULT hRslt = m_pConPtr.CreateInstance(__uuidof(Connection));
    if (!SUCCEEDED(hRslt))
    {
        return -1;
    }

    hRslt = m_pRcrdSet.CreateInstance(_T("ADODB.Recordset"));
    if (!SUCCEEDED(hRslt))
    {
        return -1;
    }

    m_csConnection = "driver={SQL Server};Server=.\\SQLEXPRESS;DATABASE=ATMServer;UID=sa;PWD=Aa@111111;";

    return 0;
}

int CDBAdp::insert(const CString &csTblName, const CString &csParLst, const CString &csData)
{
    HRESULT hRslt = m_pConPtr->Open(_bstr_t(m_csConnection), "", "", adModeUnknown);
    if (S_OK != hRslt)
    {
        return -1;
    }

    CString csSQL("insert into ");
    csSQL += csTblName;
    csSQL += " ( ";
    csSQL += csParLst;
    csSQL += " ) values ( ";
    csSQL += csData;
    csSQL += ")";
    _variant_t oRecord;
    _bstr_t strSQL(csSQL);
    try
    {
        hRslt = m_pConPtr->Execute(strSQL, &oRecord, adCmdText);
        // 这里不要应该通过捕获异常判断处理结果,不建议使用返回值判断
        //if (S_OK != hRslt)
        //{
        //  return -1;
        //}
    }
    catch (_com_error e)
    {
        _bstr_t bsSource(e.Source());
        _bstr_t bsDescription(e.Description());
    }


    m_pConPtr->Close();
    m_pConPtr.Release();

    return 0;
}

int CDBAdp::select(const CString &csTblName, const CString &csCnd)
{
    CString csSQL("select * from ");
    csSQL += csTblName;
    if (!csCnd.IsEmpty())
    {
        csSQL += " where ";
        csSQL += csCnd;
    }
    _variant_t varOpen(m_csConnection);
    _variant_t varSQL(csSQL);

    HRESULT hRslt = m_pRcrdSet->Open(varSQL, varOpen, adOpenStatic, adLockOptimistic, adCmdText);
    if (FAILED(hRslt))
    {
        return -1;
    }

    while (!m_pRcrdSet->GetadoEOF())
    {
        _variant_t varAcntNO = m_pRcrdSet->GetCollect("acountNO");
        _variant_t varID = m_pRcrdSet->GetCollect("userid");
        _variant_t varBlnc = m_pRcrdSet->GetCollect("balance");
    }

    m_pRcrdSet->Close();
    m_pRcrdSet.Release();

    return 0;
}

int CDBAdp::update(const CString &csTblName, const CString &csData, const CString &csCnd)
{
    CString csSQL("update ");

    csSQL += csTblName;
    csSQL += "Table_Acount set ";
    csSQL += csData;
    if (!csCnd.IsEmpty())
    {
        csSQL += " where ";
        csSQL += csCnd;
    }

    HRESULT hRslt = m_pConPtr->Open(_bstr_t(m_csConnection), "", "", adModeUnknown);
    if (S_OK != hRslt)
    {
        return -1;
    }

    _variant_t oRcrd;
    hRslt = m_pConPtr->Execute(_bstr_t(csSQL), &oRcrd, adCmdText);
    if (S_OK != hRslt)
    {
        return -1;
    }

    return 0;
}

int CDBAdp::addNewAcount(const ACOUNT_INFO &oAcntInfo)
{
    CString csParams("");
    csParams += "acountNO, userid, balance, passwd";

    CString csData("\'");
    csData += oAcntInfo.m_csAcntNO;
    csData += "\', \'";
    csData += oAcntInfo.m_csUsrID;
    csData += "\', ";
    csData += oAcntInfo.m_csBalance;
    csData += ", ";
    csData += oAcntInfo.m_csPasswd;

    return insert(CString("Table_Acount"), csParams, csData);
}

int CDBAdp::addNewCstmInfo(const CSTM_INFO &oCstomInfo)
{
    CString csParams("");
    csParams = "ID, name, sex, mobile, company";

    CString csData("");
    csData += "\'";
    csData += oCstomInfo.m_csID;
    csData += "\', \'";
    csData += oCstomInfo.m_csName;
    csData += "\', \'";
    csData += oCstomInfo.m_csSex;
    csData += "\', \'";
    csData += oCstomInfo.m_csMobile;
    csData += "\', \'";
    csData += oCstomInfo.m_csCmpny;
    csData += "\'";

    return insert(CString("Table_Cstom"), csParams, csData);
}

int CDBAdp::updateAcountInfo(const ACOUNT_INFO &oAcntInfo)
{
    if (oAcntInfo.m_csAcntNO.IsEmpty())
    {
        return -1;
    }

    CString csData(""), csCnd("");
    if (!oAcntInfo.m_csBalance.IsEmpty())
    {
        csData += "balance = ";
        csData += oAcntInfo.m_csBalance;
        csData += ", ";
    }

    if (!oAcntInfo.m_csPasswd.IsEmpty())
    {
        csData += "passwd = ";
        csData += oAcntInfo.m_csPasswd;
        csData += " ";
    }

    csCnd += "acountNO = ";
    csCnd += oAcntInfo.m_csAcntNO;

    update(_T("Table_Acount"), csData, csCnd);

    return 0;
}

int CDBAdp::queryAcountInfoByAcntNO(ACOUNT_INFO &oAcntInfo)
{
    if (oAcntInfo.m_csAcntNO.IsEmpty())
    {
        return -1;
    }

    CString csCnd("");
    csCnd += "acountNO = \'";
    csCnd += oAcntInfo.m_csAcntNO;
    csCnd += "\'";

    CString csSQL("select * from Table_Acount");
    csSQL += " where ";
    csSQL += "acountNO = \'";
    csSQL += oAcntInfo.m_csAcntNO;
    csSQL += "\'";

    _variant_t varOpen(m_csConnection);
    _variant_t varSQL(csSQL);

    HRESULT hRslt = m_pRcrdSet->Open(varSQL, varOpen, adOpenStatic, adLockOptimistic, adCmdText);
    if (FAILED(hRslt))
    {
        return -1;
    }
    else if (m_pRcrdSet->GetadoEOF())
    {
        return -2;
    }

    _variant_t varAcntNO = m_pRcrdSet->GetCollect("acountNO");
    _variant_t varID = m_pRcrdSet->GetCollect("userid");
    _variant_t varBlnc = m_pRcrdSet->GetCollect("balance");
    _variant_t varPasswd = m_pRcrdSet->GetCollect("passwd");

    oAcntInfo.m_csAcntNO = (char*)_bstr_t(varAcntNO);
    oAcntInfo.m_csPasswd = (char*)_bstr_t(varPasswd);
    oAcntInfo.m_csBalance = (char*)_bstr_t(varBlnc);
    oAcntInfo.m_csUsrID = (char*)_bstr_t(varID);

    oAcntInfo.m_csAcntNO.Trim();
    oAcntInfo.m_csPasswd.Trim();
    oAcntInfo.m_csBalance.Trim();
    oAcntInfo.m_csUsrID.Trim();

    m_pRcrdSet->Close();
    m_pRcrdSet.Release();

    return 0;
}

注:在调用SQL执行语句时,建议使用try、catch捕获并处理异常,不建议使用返回值判断执行是否成功。在实际测试过程中,很多时候SQL执行成功了,但是返回值还是不正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值