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

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

相关文章

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn