您的位置:首页 > 数据库

VisualStudio 2008连接SQLServer 2005 Express数据库

2017-08-07 16:16 405 查看
由于工作需要,前段时间重新实现了下使用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身份认证”,点击“连接”后进入管理界面。



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:
_Connectio
4000
nPtr 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执行成功了,但是返回值还是不正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息