数据库访问接口-数据源创建连接释放

2024-09-02 12:48

本文主要是介绍数据库访问接口-数据源创建连接释放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(一)数据库编程组件间的关系示意图



(二)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 IDInitProperties[2].dwPropertyID      = DBPROP_AUTH_USERID;InitProperties[2].vValue.vt         = VT_BSTR;InitProperties[2].vValue.bstrVal    = SysAllocString(OLESTR("sa"));// PasswordInitProperties[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;
}




这篇关于数据库访问接口-数据源创建连接释放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129998

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择