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

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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性