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

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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现