数据源的三种访问方式

2024-09-02 12:48
文章标签 访问 三种 方式 数据源

本文主要是介绍数据源的三种访问方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据源的三种访问方式:

1、使用OLEDB数据库连接对话框  链接到数据源

2、使用纯代码方式连接到指定的数据源

3、使用连接字符串得到一个IDBInitialize接口

代码:

#include <tchar.h>
#include <windows.h>
#include <strsafe.h>#define COM_NO_WINDOWS_H    //如果已经包含了Windows.h或不使用其他Windows库函数时
#define DBINITCONSTANTS
#define INITGUID
#define OLEDBVER 0x0260 
#include <oledb.h>
#include <oledberr.h>
#include <msdasc.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;}#define GRS_DEF_INTERFACE(i) i* p##i = NULL;
#define GRS_QUERYINTERFACE(i,iid) \if(FAILED(hr = (i)->QueryInterface(IID_##iid, (void **)&p##iid)) )\{\GRS_PRINTF(_T("不支持'%s'接口\n"),_T(#iid));\}\else\{\GRS_PRINTF(_T("支持'%s'接口\n"),_T(#iid));\}\GRS_SAFERELEASE(p##iid);//FAILED(hr = CLSIDFromProgID(L"SQLOLEDB", &clsid) )int _tmain()
{GRS_USEPRINTF();CoInitialize(NULL);//初始化COM组件IDBPromptInitialize*				pIDBPromptInitialize		=NULL;IDataInitialize*						pIDataInitialize				=NULL;LPOLESTR								pLinkString					=NULL;//以下是IDBInitialize接口的等价接口定义//1必须支持的接口GRS_DEF_INTERFACE(IDBInitialize);GRS_DEF_INTERFACE(IDBCreateSession);GRS_DEF_INTERFACE(IDBProperties);GRS_DEF_INTERFACE(IPersist);//2可选择支持的GRS_DEF_INTERFACE(IConnectionPointContainer);GRS_DEF_INTERFACE(IDBAsynchStatus);GRS_DEF_INTERFACE(IDBDataSourceAdmin);GRS_DEF_INTERFACE(IDBInfo);GRS_DEF_INTERFACE(IPersistFile);GRS_DEF_INTERFACE(ISupportErrorInfo);HWND hWndParent=GetDesktopWindow();CLSID clsid={};//1使用OLEDB数据库连接对话框链接到数据源HRESULT hr=CoCreateInstance(CLSID_DataLinks,NULL,CLSCTX_INPROC_SERVER,IID_IDBPromptInitialize,(void**)&pIDBPromptInitialize);//下面这句话弹出数据库连接对话框hr=pIDBPromptInitialize->PromptDataSource(NULL,hWndParent,   //DBPROMPTOPTIONS_PROPERTYSHEET,0,NULL,NULL,IID_IDBInitialize,(IUnknown**)&pIDBInitialize);hr=pIDBPromptInitialize->QueryInterface(IID_IDataInitialize,(void**)&pIDataInitialize);hr=pIDataInitialize->GetInitializationString(pIDBInitialize,TRUE,&pLinkString);hr=pIDBInitialize->Initialize();//测试都支持哪些接口/*GRS_QUERYINTERFACE(pIDBInitialize,IDBCreateSession);GRS_QUERYINTERFACE(pIDBInitialize,IDBProperties);GRS_QUERYINTERFACE(pIDBInitialize,IPersist);GRS_QUERYINTERFACE(pIDBInitialize,IConnectionPointContainer);GRS_QUERYINTERFACE(pIDBInitialize,IDBAsynchStatus);GRS_QUERYINTERFACE(pIDBInitialize,IDBDataSourceAdmin);GRS_QUERYINTERFACE(pIDBInitialize,IDBInfo);GRS_QUERYINTERFACE(pIDBInitialize,IPersistFile);GRS_QUERYINTERFACE(pIDBInitialize,ISupportErrorInfo);
*///断开数据库连接
pIDBInitialize->Uninitialize();
GRS_SAFERELEASE(pIDBInitialize);
GRS_SAFERELEASE(pIDBPromptInitialize);//2使用纯代码方式链接到指定的数据源
hr=CoCreateInstance(		CLSID_MSDAINITIALIZE,NULL,CLSCTX_INPROC_SERVER,IID_IDataInitialize,(void**)&pIDataInitialize);
hr=CLSIDFromProgID(_T("SQLOLEDB"),&clsid);
//创建数据源链接对象和初始化接口
hr=pIDataInitialize->CreateDBInstance(	clsid,NULL,CLSCTX_INPROC_SERVER,NULL,IID_IDBInitialize,(IUnknown**)&pIDBInitialize);
//准备连接属性
//虽然后面只有4个属性,但是仍然要定义和初始化4+1个属性
DBPROP InitProperties[5]={};
DBPROPSET rgInitPropSet[1]={};//指定数据库实例名
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;//得到数据库初始化的属性接口
hr=pIDBInitialize->QueryInterface(IID_IDBProperties,(void**)&pIDBProperties);
GRS_COM_CHECK(hr,_T("获取IDBProperties接口失败,错误码:0x%08\n"),hr);
hr=pIDBProperties->SetProperties(1,rgInitPropSet);
GRS_COM_CHECK(hr,_T("设置链接属性失败,错误码:0x%08\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);//3使用链接字符串得到一个IDBInitialize接口
hr=pIDataInitialize->GetDataSource(	NULL,CLSCTX_INPROC_SERVER, //class context in process serverL"Provider=SQLOLEDB.1;Persist Security info=False;User ID=sa;Password=tiger;Initial Catalog=scott; Data Source=YuZhiBo-PC;",__uuidof(IDBInitialize),(IUnknown**)&pIDBInitialize);
GRS_COM_CHECK(hr,_T("使用连接字符串获取数据源接口IDBInitialize失败"));
//链接到数据库
hr=pIDBInitialize->Initialize();
GRS_COM_CHECK(hr,_T("使用连接字符串链接数据源失败。\n"));
GRS_PRINTF(_T("使用字符串连接到数据源成功!\n"));CLEAR_UP:if(NULL != pIDBInitialize){pIDBInitialize->Uninitialize();}GRS_SAFERELEASE(pIDBProperties);GRS_SAFERELEASE(pIDataInitialize);GRS_SAFERELEASE(pIDBInitialize);GRS_SAFERELEASE(pIDBPromptInitialize);_tsystem(_T("PAUSE"));CoUninitialize();return 0;
}


这篇关于数据源的三种访问方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4