由于工作需要,前段时间重新实现了下使用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:
_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执行成功了,但是返回值还是不正确。
本文详细介绍了如何使用Visual Studio 2008连接到SQL Server 2005 Express数据库,包括安装Visual Studio和SQL Server管理工具,配置SQL Server网络协议,创建数据库和用户,以及开发C++数据库接口的步骤。同时强调了在数据库操作中异常处理的重要性。
907

被折叠的 条评论
为什么被折叠?



