数据库访问接口-数据源创建连接释放
2014-09-05 11:45
260 查看
(一)数据库编程组件间的关系示意图
![](http://img.blog.csdn.net/20140905105448562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI1ODMxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(二)OLEDB编程基本框架和步骤
![](http://img.blog.csdn.net/20140905105131194?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI1ODMxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
接口 IDBCreateSession总接口中CreateSession方法创建Session
对象Session的接口IDBCreateCommand接口中CreateCommand方法创建Command对象
Command对象接口ICommand接口中的Execute()创建Rowset对象。
1DataSource
描述:定义一个环境,数据提供者的一些属性。
2Session
描述:包装一个事物,产生原事物的一个结果集,每个表的字段,主键,约束关系等
3Command
描述:设置一个sql语句,可以执行sql语句,设置参数,属性,得到最终的结果集。
4Rowset
描述:理解为一个结构体的数组(结果集)
(三)数据源对象
数据源对象代表到数据库的一个链接
是使用或链接数据源需要创建的第一个对象
数据源对象提供下面接口
(四)连接到数据源
创建了IDBInitialize接口后,虽然有了数据源对象,但是并不表示已经连接到了数据源上,之后还要设置前述的几个基本属性给数据源对象,以便数据提供者严明正身,提供链接并准备缓冲
①首先需要从IDBInitialize接口Query出IDBProperties接口
②其次准备GUID为DBPROPSET_DBINIT的DBPROPSET结构体和前述几个属性对应值组成的DBPROP数组。
③调用IDBProperties接口的SetProperties方法设置上述属性
④最后调用IDBInitialize的Initialize方法链接到数据库
代码:
精简一下:(仅仅理解用)
(二)OLEDB编程基本框架和步骤
接口 IDBCreateSession总接口中CreateSession方法创建Session
对象Session的接口IDBCreateCommand接口中CreateCommand方法创建Command对象
Command对象接口ICommand接口中的Execute()创建Rowset对象。
1DataSource
描述:定义一个环境,数据提供者的一些属性。
2Session
描述:包装一个事物,产生原事物的一个结果集,每个表的字段,主键,约束关系等
3Command
描述:设置一个sql语句,可以执行sql语句,设置参数,属性,得到最终的结果集。
4Rowset
描述:理解为一个结构体的数组(结果集)
(三)数据源对象
数据源对象代表到数据库的一个链接
是使用或链接数据源需要创建的第一个对象
数据源对象提供下面接口
Cotype TDataSource { [mandatory] interface IDBCreateSession; [mandatory] interface IDBInitialize; [mandatory] interface IDBProperties; [mandatory] interface IPersist; [optional] interface IConnectionPointContainer; [optional] interface IDBAsynchStatus; [optional] interface IDBDataSourceAdmin; [optional] interface IDBInfo; [optional] interface IPersistFile; [optional] interface ISupportErrorInfo; } //[mandatory]强制的,可以理解为基本属性 数据源对象必须提供的,必须实现的 一般 //将接口IDBInitialize作为DataSource对象的标志 //[optional]可选支持的, 不常用
(四)连接到数据源
创建了IDBInitialize接口后,虽然有了数据源对象,但是并不表示已经连接到了数据源上,之后还要设置前述的几个基本属性给数据源对象,以便数据提供者严明正身,提供链接并准备缓冲
①首先需要从IDBInitialize接口Query出IDBProperties接口
②其次准备GUID为DBPROPSET_DBINIT的DBPROPSET结构体和前述几个属性对应值组成的DBPROP数组。
③调用IDBProperties接口的SetProperties方法设置上述属性
④最后调用IDBInitialize的Initialize方法链接到数据库
代码:
#include <tchar.h> #include <windows.h> #include <strsafe.h> #define COM_NO_WINDOWS_H //如果已经包含了Windows.h或不使用其他Windows库函数时 #define OLEDBVER 0x0260 //MSDAC2.6版 #include <oledb.h> #include <oledberr.h> #define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(),0,sz) #define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz) #define GRS_SAFEFREE(p) if(NULL != p){HeapFree(GetProcessHeap(),0,p);p=NULL;} #define GRS_USEPRINTF() TCHAR pBuf[1024] = {} #define GRS_PRINTF(...) \ StringCchPrintf(pBuf,1024,__VA_ARGS__);\ WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),pBuf,lstrlen(pBuf),NULL,NULL); #define GRS_SAFERELEASE(I) if(NULL != (I)){(I)->Release();(I)=NULL;} #define GRS_COM_CHECK(hr,...) if(FAILED(hr)){GRS_PRINTF(__VA_ARGS__);goto CLEAR_UP;} int _tmain() { GRS_USEPRINTF(); CoInitialize(NULL); HRESULT hr = S_OK; IDBInitialize* pIDBInitialize = NULL; IDBProperties* pIDBProperties = NULL; CLSID clDBSource = {}; hr = CLSIDFromProgID(_T("SQLOLEDB"), &clDBSource); GRS_COM_CHECK(hr,_T("获取SQLOLEDB的CLSID失败,错误码:0x%08x\n"),hr); //2、使用纯代码方式连接到指定的数据源 hr = CoCreateInstance(clDBSource, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize,(void**)&pIDBInitialize); GRS_COM_CHECK(hr,_T("无法创建IDBInitialize接口,错误码:0x%08x\n"),hr); //准备连接属性 //注意虽然后面只使用了4个属性,但是任然要定义和初始化4+1个属性 //目的是让属性数组最后总有一个空的属性作为数组结尾 DBPROP InitProperties[5] = {}; DBPROPSET rgInitPropSet[1] = {}; //指定数据库实例名,这里使用了别名local,指定本地默认实例 InitProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE; InitProperties[0].vValue.vt = VT_BSTR; InitProperties[0].vValue.bstrVal = SysAllocString(L"ASUS-PC\\SQL2008"); InitProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED; InitProperties[0].colid = DB_NULLID; //指定数据库名 InitProperties[1].dwPropertyID = DBPROP_INIT_CATALOG; InitProperties[1].vValue.vt = VT_BSTR; InitProperties[1].vValue.bstrVal = SysAllocString(L"Study"); InitProperties[1].dwOptions = DBPROPOPTIONS_REQUIRED; InitProperties[1].colid = DB_NULLID; // User ID InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID; InitProperties[2].vValue.vt = VT_BSTR; InitProperties[2].vValue.bstrVal = SysAllocString(OLESTR("sa")); // Password InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD; InitProperties[3].vValue.vt = VT_BSTR; InitProperties[3].vValue.bstrVal = SysAllocString(OLESTR("999999")); //创建一个GUID为DBPROPSET_DBINIT的属性集合,这也是初始化连接时需要的唯一一个标准属性集合 rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT; rgInitPropSet[0].cProperties = 4; rgInitPropSet[0].rgProperties = InitProperties; //得到数据库初始化的属性接口 hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties); GRS_COM_CHECK(hr,_T("获取IDBProperties接口失败,错误码:0x%08x\n"),hr); hr = pIDBProperties->SetProperties(1, rgInitPropSet); GRS_COM_CHECK(hr,_T("设置连接属性失败,错误码:0x%08x\n"),hr); //属性一但设置完成,相应的接口就可以释放了 GRS_SAFERELEASE(pIDBProperties); //根据指定的属性连接到数据库 hr = pIDBInitialize->Initialize(); GRS_COM_CHECK(hr,_T("使用属性连接到数据源失败,错误码:0x%08x\n"),hr); GRS_PRINTF(_T("使用属性集方式连接到数据源成功!\n")); //这里实际上已经拥有了一个正常的数据源对象,可以进一步进行需要的操作 //.................. pIDBInitialize->Uninitialize(); GRS_SAFERELEASE(pIDBInitialize); CLEAR_UP: GRS_SAFERELEASE(pIDBProperties); GRS_SAFERELEASE(pIDBInitialize); _tsystem(_T("PAUSE")); CoUninitialize(); return 0; }
精简一下:(仅仅理解用)
#include <tchar.h> #include <windows.h> #include <strsafe.h> #define COM_NO_WINDOWS_H //如果已经包含了Windows.h或不使用其他Windows库函数时 #define OLEDBVER 0x0260 //MSDAC2.6版 #include <oledb.h> #include <oledberr.h> int _tmain() { CoInitialize(NULL); HRESULT hr=S_FALSE; IDBInitialize* pIDBInitialize=NULL; IDBProperties* pIDBProperties=NULL; CLSID clDBSource={}; CLSIDFromProgID(_T("SQLOLEDB"),&clDBSource); //使用纯代码方式连接到指定的数据源 hr = CoCreateInstance(clDBSource, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize,(void**)&pIDBInitialize); /*1首先需要从IDBInitialize接口Query出IDBProperties接口*******/ hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties); /*2其次准备GUID为DBPROPSET_DBINIT的DBPROPSET结构体和前述几个属性对应值组成的DBPROP数组***/ DBPROP InitProperties[5] = {}; DBPROPSET rgInitPropSet[1] = {}; //指定数据库实例名,这里使用了别名local,指定本地默认实例 InitProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE; InitProperties[0].vValue.vt = VT_BSTR; InitProperties[0].vValue.bstrVal = SysAllocString(L"YuZhiBo-PC"); InitProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED; InitProperties[0].colid = DB_NULLID; //指定数据库名 InitProperties[1].dwPropertyID = DBPROP_INIT_CATALOG; InitProperties[1].vValue.vt = VT_BSTR; InitProperties[1].vValue.bstrVal = SysAllocString(L"scott"); InitProperties[1].dwOptions = DBPROPOPTIONS_REQUIRED; InitProperties[1].colid = DB_NULLID; // User ID InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID; InitProperties[2].vValue.vt = VT_BSTR; InitProperties[2].vValue.bstrVal = SysAllocString(OLESTR("sa")); // Password InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD; InitProperties[3].vValue.vt = VT_BSTR; InitProperties[3].vValue.bstrVal = SysAllocString(OLESTR("tiger")); //创建一个GUID为DBPROPSET_DBINIT的属性集合,这也是初始化连接时需要的唯一一个标准属性集合 rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT; rgInitPropSet[0].cProperties = 4; rgInitPropSet[0].rgProperties = InitProperties; /*3调用IDBProperties接口的SetProperties方法设置上述属性****/ hr = pIDBProperties->SetProperties(1, rgInitPropSet); /*4最后调用IDBInitialize的Initialize方法链接到数据库*********/ hr=pIDBInitialize->Initialize(); pIDBInitialize->Uninitialize(); return 0; }
相关文章推荐
- ssh框架配置数据源 数据库连接没有正常释放
- 数据库访问的一些公共的方法01-创建SQL数据库或Acess数据库等连接对象
- MySQL创建数据库,授权用户访问权限,通过Navicat Premium进行连接
- 解决SQLSERVER查询连接数据库表问题:OLE DB 访问接口 "MSDASQL" 为列提供的元数据不一致
- QT5+sql server(ODBC)创建数据源并且连接数据库
- ssh框架配置数据源 数据库连接没有正常释放
- 使用Spring连接数据库数据创建JSON数据 作为接口
- 【傻瓜式】QT5+sql server(ODBC)创建数据源并且连接数据库
- Oracle调用接口(OCI)源码剖析(1):创建数据库连接
- 解决cognos创建数据源连接本地数据库失败问题
- Tomcat6.0.37以数据源(jndi)方式访问数据库,数据库连接字符串
- SpringBoot-创建RESTful风格的 http接口访问jpa 来操作数据库
- [Wondgirl] ThinkPHP-json数据接口的创建(二)连接数据库和json数据接口的创建
- 用数据源(ODBC)创建数据库连接DSN设置
- 一步步学习SPD2010--第七章节--使用BCS业务连接服务(2)--创建数据库外部数据源
- 一步步学习SPD2010--第七章节--使用BCS业务连接服务(2)--创建数据库外部数据源
- HFM接口数据源数据库表创建脚本
- 如何创建数据源进行与数据库的连接
- SQL2008 使用新创建的身份验证连接到数据库后无法访问具体数据库
- 创建WebPart时的数据库连接问题。