VisualStudio 2008连接SQLServer 2005 Express数据库
2017-08-10 10:20
477 查看
由于工作需要,前段时间重新实现了下使用VisualStudio、SQLServer实现简单的数据库访问的小程序,整个过程并不复杂,但是还是踩了不少坑,现在把过程贡献出来,供初学者参考。
整个实现流程大致分为:安装VisualStudio、SQLServer Management Studio软件、配置SQLServer、创建数据库并适配C++代码三部分。其中SQLServer用VisualStudio安装时顺带安装的Express版本就行。
1. 安装VisualStudio。
这个过程基本就是不断“下一步”的过程,建议初学者选择“完全安装”模式。
安装SQLServer 管理工具:SQLServer Management Studio;
配置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. 在本次开发中,为了使用方便,将数据库访问接口和数据库库访问的底层接口封装在一个类中,实际使用中,建议将底层接口单独封装。代码如下:
4.2. 数据库接口类实现
注:在调用SQL执行语句时,建议使用try、catch捕获并处理异常,不建议使用返回值判断执行是否成功。在实际测试过程中,很多时候SQL执行成功了,但是返回值还是不正确。
Created by 王彬
整个实现流程大致分为:安装VisualStudio、SQLServer Management Studio软件、配置SQLServer、创建数据库并适配C++代码三部分。其中SQLServer用VisualStudio安装时顺带安装的Express版本就行。
1. 安装VisualStudio。
这个过程基本就是不断“下一步”的过程,建议初学者选择“完全安装”模式。
安装SQLServer 管理工具:SQLServer Management Studio;
配置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, adCmd 4000 Text); 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执行成功了,但是返回值还是不正确。
Created by 王彬
相关文章推荐
- VisualStudio 2008连接SQLServer 2005 Express数据库
- eclipse的单步调试和java连接数据库2008或2005
- 使用JDBC连接MSSQL数据库中2000/2005/2008的区别
- mysql, sqlserver 2005 express, oracle xe轻量级免费数据库比较
- asp.net连接数据库(SQL Server 2005 Express)详细说明
- mysql, sqlserver 2005 express, oracle xe轻量级免费数据库比较
- asp.net连接数据库(SQL Server 2005 Express)详细说明
- windows 2008上启用防火墙后 sqlserver 2005连接超时的解决办法
- SqlServer 2005/2008数据库被标记为“可疑”的解决办法
- 安装sql 2005 express 后,并使用navicat远程连接数据库。
- 【JSP动态网站】JDBC连接SqlServer 2008数据库
- 在jsp页面中连接sqlserver 2005数据库遇到的问题
- 【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法
- 无法用TCP/IP协议连接远端SQL Server EXPRESS 2005 数据库问题
- Visual C# 2008+SQL Server 2005 数据库与网络开发--7.1.2 连接数据库
- thinkphp3.2.3连接sqlserver 2008 R2 数据库
- SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005
- Java连接SqlServer 2008数据库
- 无法用TCP/IP协议连接远端SQL Server EXPRESS 2005 数据库问题
- SqlServer 2005/2008数据库被标记为“可疑”的解决办法