封装一个ado的数据库操作
2014-08-15 10:30
309 查看
vc数据库基本操作
对于vc连接数据库其实也很简单,vc深入详解中讲解的已经很清除了:首先要先在头文件(stdafx.h)中加入(masdo15.dll拷贝到工程目录下):
#import "msado15.dll" no_namespace rename("EOF","rsEOF")查询与更新:
{ CoInitialize(NULL); //初始化组件 _ConnectionPtr pConn(__uuidof(Connection)); _RecordsetPtr pRst(__uuidof(Recordset)); pConn->ConnectionString = "provider=SQLOLEDB; Server=127.0.0.1; DataBase=数据库名字; uid=sa; pwd=数据库密码"; //访问的属性和方法,连接字串 try { pConn->Open("", "", "", adConnectUnspecified); //打开数据库的连接 } catch(_com_error &e) { MessageBox(e.ErrorMessage()); return; } char sql[50]="select * from userTable"; char rest[10]; pRst = pConn->Execute(sql, NULL, adCmdText); //查询时候这样返回记录 while(!pRst->rsEOF) { strcpy(rest,(_bstr_t)pRst->GetCollect("sName")); MessageBox(rest); pRst->MoveNext(); } //更新代码 pConn->Execute(sql, NULL, adCmdText) //更新时候不需要返回值 pRst->Close(); pConn->Close(); pRst.Release(); pConn.Release(); CoUninitialize(); //卸载组件 }
其实上面的语句执行也应该放到try{}catch()中,这里只是尽量简化操作,记录主体而已。
如果在实际应用中,上面的操作有点复杂,特别是众多try,catch.下面是我封装了一下这些操作的一个示例:
1.首先在stdafx中加入如下语句:
#import "msado15.dll" no_namespace rename("EOF","rsEOF") #include "DBsqlServer.h" extern CDBsqlServer* g_pDB;
在程序初始化时候
::CoInitialize(NULL);//加载组件
if( !g_pDB->Initialize("127.0.0.1", "数据库密码") )
return FALSE;
//在程序退出时候卸载组件
::CoUninitialize();
2.查找与更新操作如下:
CSqlStatement *stmt = g_pDB->ExecuteSQL(strSQL); if( stmt != NULL && stmt->NextRow() ) //如果查询多个while(stmt->NextRow()) { nCount = stmt->ValueInt(“字段名”); //获取整形值 str = stmt->ValueString(“字段名”); //获取字符串值 nCount = stmt->ValueInt(); //如果查询count值时候 } delete stmt;//别忘了delete
封装的也很简单,代码如下:
.h
/************************************************************************/ /* 数据库封装类 */ /* 1.CSalStatement用于取值 */ /* 2.CDBsqlServer操作数据库 */ /* 3.cpp文件中有个g_pDB全局变量,用这个来操作数据库 */ /* 4.如果查询语句别忘了delete掉返回的结果集 */ /* 5.(其实CSqlStatement重载'='也可以做成局部变量的形势,以后再处理吧) */ /* 用法: */ /* 1.stdafx.h或其它头文件下 */ /* #import "msado15.dll" no_namespace rename("EOF","rsEOF") */ /* extern CDBsqlServer* g_pDB; */ /* 2.程序初始化时候 */ /* ::CoInitialize(NULL); */ /* g_pDB->Initialize(dbName, dbPsw); */ /* 3.查询时候 */ /* CSqlStatement *stmt = g_pDB->ExecuteSQL(strSQL); */ /* if( stmt != NULL && stmt->NextRow() ) */ /* nCount = stmt->ValueInt(); */ /* delete stmt; */ /* 执行不返回结果的语句时: */ /* g_pDB->UpdateSQL( strSQL ); */ /* 4.程序退出时候别忘了: ::CoUninitialize(); */ /************************************************************************/ #pragma once class CSqlStatement { public: CSqlStatement(CString sql); ~CSqlStatement(); friend class CDBsqlServer; BOOL NextRow(); long ValueInt(CString value = ""); CString ValueString(CString value); protected: BOOL Executesql(); protected: _RecordsetPtr m_recordset; BOOL m_bFirst; CString m_strSQL; }; class CDBsqlServer { public: BOOL Initialize(CString sDBname, CString sDBpsw); BOOL UpdateSQL(const CString strSQL); CSqlStatement* ExecuteSQL(const CString strSQL); static CDBsqlServer *GetDBsqlServer(); protected: CDBsqlServer(); virtual ~CDBsqlServer(); BOOL ConnectDB(CString sDBname, CString sDBpsw); public: static _ConnectionPtr m_pConnection; private: static CDBsqlServer *m_pDBsql; };
.cpp
#include "stdafx.h" #include "DBsqlServer.h" CDBsqlServer *CDBsqlServer::m_pDBsql = NULL; _ConnectionPtr CDBsqlServer::m_pConnection = NULL; CDBsqlServer* g_pDB = CDBsqlServer::GetDBsqlServer(); //用这个全局变量来进行数据库操作 CDBsqlServer::CDBsqlServer() { } CDBsqlServer::~CDBsqlServer() { m_pConnection->Close(); m_pConnection.Release(); } CDBsqlServer* CDBsqlServer::GetDBsqlServer() { if(NULL == m_pDBsql) return new CDBsqlServer; return m_pDBsql; } BOOL CDBsqlServer::Initialize(CString sDBname, CString sDBpsw) { if ( (_T("") == sDBpsw) || (_T("")==sDBpsw) ) { return FALSE; } return ConnectDB(sDBname, sDBpsw); } BOOL CDBsqlServer::UpdateSQL(const CString strSQL) { try { _variant_t vr; m_pConnection->Execute((_bstr_t)strSQL,&vr,adCmdText); } catch(_com_error& e) { AfxMessageBox(e.ErrorMessage()); return FALSE; } return TRUE; } BOOL CDBsqlServer::ConnectDB(CString sDBname, CString sDBpsw) { try { m_pConnection.CreateInstance( __uuidof(Connection) ); m_pConnection->PutConnectionTimeout((long)10); //10秒超时 CString sConnect; sConnect.Format(_T("provider=SQLOLEDB; Server=%s; DataBase=ManModelDB; uid=sa; pwd=%s"), sDBname.GetBuffer(0), sDBpsw.GetBuffer(0)); m_pConnection->ConnectionString = (_bstr_t)sConnect.GetBuffer(0); m_pConnection->Open("", "", "", adConnectUnspecified); //打开数据库的连接 } catch(_com_error e) { MessageBox(NULL, e.ErrorMessage(), _T("连接数据库失败"), 0); return FALSE; } return TRUE; } CSqlStatement* CDBsqlServer::ExecuteSQL(const CString strSQL) { return new CSqlStatement(strSQL); //获得这个指针后别忘了delete掉 } ////////////////////////////////////////////////////////////////////////// //取值类 CSqlStatement::CSqlStatement(CString sql) { m_recordset = NULL; m_bFirst = TRUE; m_strSQL = sql; } CSqlStatement::~CSqlStatement() { if(m_recordset != NULL) { try { m_recordset->Close(); m_recordset.Release(); } catch(...){} } } BOOL CSqlStatement::Executesql() { m_recordset.CreateInstance(__uuidof(Recordset)); try { m_recordset = CDBsqlServer::m_pConnection->Execute((_bstr_t)m_strSQL,NULL,adCmdText); } catch(_com_error e)//捕捉异常 { MessageBox(NULL, e.ErrorMessage(), "", 0); return FALSE; } if( (!m_recordset->rsEOF) && (NULL!=m_recordset) && (!m_recordset->BOF) ) return TRUE; return FALSE; } BOOL CSqlStatement::NextRow() { if( m_bFirst ) { m_bFirst = FALSE; return Executesql(); } m_recordset->MoveNext(); if( (!m_recordset->rsEOF) && (NULL!=m_recordset) && (!m_recordset->BOF) ) return TRUE; return FALSE; } long CSqlStatement::ValueInt(CString value) { long nCount = 0; _variant_t var = m_recordset->GetCollect(value.GetBuffer(0)); if( VT_NULL != var.vt ) { if ( (strcmp("", value)) == 0 ) //select count时候用此来取值 { nCount = var.lVal; } else { nCount = atol((char*)_bstr_t(var)); } } return nCount; } CString CSqlStatement::ValueString(CString value) { _variant_t var; var = m_recordset->GetCollect(value.GetBuffer(0)); if( VT_NULL != var.vt) { return CString( (char*)_bstr_t(var) ); } else { return ""; } }
不知道是否有纰漏,还请大侠赐教....还有,这里使用了静态变量,所以值运行连接一个。
相关文章推荐
- 一个利用ADO.net操作数据库很好的操作封装
- 封装的ADO.NET对数据库操作经典类
- 我封装的ADO.NET对数据库操作经典类
- 封装的ADO.NET对数据库操作经典类
- 我封装的ADO.NET对数据库操作经典类
- 一个数据库操作类,封装所有数据库操作
- 封装的ADO.NET对数据库操作经典类
- 我封装的ADO.NET对数据库操作经典类
- [C#] 自己封装的一个数据库访问类 让ado.net 用起来和ado一样
- 封装的ADO.NET对数据库操作经典类
- [转]封装的ADO.NET对数据库操作经典类
- 一个封装了数据库大部分操作的JavaBean
- C#中一个操作数据库的类的封装,以前写的,被同学改过,很不完善
- 封装的ADO.NET对数据库操作经典类
- 封装的ADO.NET对数据库操作经典类
- 数据库经典:封装的ADO.NET对数据库操作经典类
- 封装的ADO.NET对数据库操作经典类 [更新]
- ADO数据库操作的C++封装
- 使用ADO操作数据库时一个好用的VARIANT类!
- [C#] 自己封装的一个数据库访问类 让ado.net 用起来和ado一样