VisualStudio 2008连接SQLServer 2005 Express数据库

来源:互联网 发布:经典网络军事小说 编辑:程序博客网 时间:2024/06/18 06:57
由于工作需要,前段时间重新实现了下使用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执行成功了,但是返回值还是不正确。

阅读全文
0 0
原创粉丝点击