介绍C 连接OleDBConnection数据库的操作

哎呀妈呀!小伙伴们有没有想过要用C语言去链接上数据库呢???嘿嘿嘿,没错,就是OleDbConnection啦,那么今天蒟蒻我就来给大家整整这个操作吧!

首先,我们得知道什么是OleDbConnection?它可是一个能让我们用C语言去链接各种数据库的好东西嘞!它实现了OLE DB协议的一组类,允许以 OleDbCommand、OleDbDataAdaptor 和 OleDbDataReader 等方式使用 OLE DB 访问数据库,妙不可言吧!

好的,既然我们要使用OleDbConnection进行数据库链接,那么我们得先开动手指打一下代码了。(下面的代码是针对Microsoft Access数据库的,其他数据库需要修改ConnectionString参数)

首先,我们需要引入相应的头文件:

#include

#include

#include

#include

#include

#include

#include

接下来,需要定义一些宏和变量,详细的意思注释如下:

#define BUFFER_LEN 64

#define TABLENAME _T("PersonInfo") //数据库中的表名

#define STMTLEN 100

TCHAR szProvider[] = _T("Microsoft.Jet.OLEDB.4.0");

TCHAR szDataSource[] = _T("D:\\Data\\students.mdb"); //数据库文件路径

TCHAR szPersist[] = _T("Persist Security Info=False");

TCHAR szConnectString[BUFFER_LEN];

DBPROPIDSET rgPropSet[1];

DWORD dwStatus;

HRESULT hr;

IDBInitialize *pIDBInitialize = NULL;

IOpenRowset *pIOpenRowset = NULL;

IDBCreateSession *pIDBCreateSession;

ISessionProperties *pISessionProperties = NULL;

DBID dbidTable;

DBID dbidCol;

HACCESSOR hAccessor;

这里面涉及了一些重要的变量和宏的定义,要认真看哟!

然后,我们需要定义一个函数,这个函数是用来建立连接的,代码如下:

HRESULT EstablishConnection()

{

HRESULT hr;

TCHAR strFilePath[MAX_PATH] = {0};

// 创建工作空间

hr = CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (LPVOID *)&pIDBInitialize);

if (FAILED(hr)) {

printf("Create workspace failed!\n");

return hr;

}

// 设置数据源的属性

hr = pIDBInitialize -> Initialize();

if(FAILED(hr)) {

printf("Initialize() has failed!\n");

return hr;

}

// 获取IDBCreateSession接口

hr = pIDBInitialize -> QueryInterface(

IID_IDBCreateSession,

(void**)&pIDBCreateSession

);

if (FAILED(hr)) {

printf("Query interface of IDBCreateSession fialed!\n");

return hr;

}

//建立连接的字符串

_stprintf_s(szConnectString, BUFFER_LEN, _T("Provider=%s;Data Source=%s;Jet OLEDB:Database Password=; %s"),szProvider, szDataSource, szPersist);

hr = pIDBCreateSession -> CreateSession(NULL, IID_ISessionProperties, (IUnknown **)&pISessionProperties);

if (FAILED(hr)) {

printf("CreateSession() failed!\n");

return hr;

}

//设置数据源属性

hr = pISessionProperties -> SetProperty(DBPROPSET_DBINIT, DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, VARIANT_TRUE);

if (FAILED(hr)) {

printf("Set DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO is failed!\n");

return hr;

}

hr = pISessionProperties -> SetProperty(DBPROPSET_DBINIT, DBPROP_INIT_PROMPT, (int)FALSE);

if (FAILED(hr)) {

printf("Set DBPROP_INIT_PROMPT is failed!\n");

return hr;

}

hr = pISessionProperties -> SetProperty(DBPROPSET_DBINIT, DBPROP_INIT_DATASOURCE, szDataSource);

if (FAILED(hr)) {

printf("Set DBPROP_INIT_DATASOURCE is failed!\n");

return hr;

}

hr = pISessionProperties -> SetProperty(DBPROPSET_DBINIT, DBPROP_INIT_PROVIDERSTRING, szConnectString);

if (FAILED(hr)) {

printf("Set DBPROP_INIT_PROVIDERSTRING is failed!\n");

return hr;

}

return hr;

}

这个函数是我们建立连接的核心所在,在调用此函数之前,需要先设置一些参数以及数据源的属性等。

最后,我们再写一个函数,来释放资源,代码如下:

void ReleaseResource()

{

if (hAccessor) {

pIOpenRowset ->ReleaseAccessor(hAccessor, NULL);

hAccessor = NULL;

}

if (pIOpenRowset) {

pIOpenRowset -> Release();

pIOpenRowset = NULL;

}

if (pIDBCreateSession) {

pIDBCreateSession -> Release();

pIDBCreateSession = NULL;

}

if (pIDBInitialize) {

pIDBInitialize -> Uninitialize();

pIDBInitialize -> Release();

pIDBInitialize = NULL;

}

if (pISessionProperties) {

pISessionProperties -> Release();

pISessionProperties = NULL;

}

}

那么,我们现在就可以愉快地使用OleDbConnection 来链接上我们的数据库啦!下面给大家一个简单的查询的例子作为参考:

int main(void)

{

HRESULT hr;

IRowset *pIRowset = NULL;

HROW hRow;

HACCESSOR hAccessor;

ULONG ulTableType = 0;

DBBINDING dbBind[3];

BYTE buffer[1024] = {0};

TCHAR stmt[100] = _T("Select * from PersonInfo");

TCHAR tchName[100] = { 0 }, tchSex[100] = { 0 }, tchAge[5] = { 0 };

TCHAR strDataSource[MAX_PATH] = { 0 };

//建立连接

hr = EstablishConnection();

if (FAILED(hr)) {

printf("EstablishConnection() error!\n");

return -1;

}

//获取IOpenRowset指针

hr = pIDBCreateSession -> GetDataSource(NULL, IID_IOpenRowset, (IUnknown **)&pIOpenRowset);

if (FAILED(hr)) {

printf("GetDataSource() failed!\n");

return -1;

}

//执行查询

hr = pIOpenRowset -> OpenRowset(NULL, &dbidTable, NULL, IID_IRowset, 0, NULL, (IUnknown **)&pIRowset);

if (FAILED(hr)) {

printf("OpenRowset() failed!\n");

return -1;

}

//为检索结果创建访问方法

hr = pIRowset -> GetNextRows(0, 0, 1, &ulTableType, &hRow);

if (FAILED(hr)) {

printf("GetNextRows() failed!\n");

return -1;

}

//设置访问器

dbBind[0].iOrdinal = 1;

dbBind[0].wType = DBTYPE_WSTR;

dbBind[0].pTypeInfo= NULL;

dbBind[0].pBindExt = NULL;

dbBind[0].pObject = NULL;

dbBind[0].dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS;

dbBind[0].pVarData = NULL;

dbBind[0].obLength = 0;

dbBind[0].obStatus = 0;

dbBind[0].cbMaxLen = sizeof(tchName);

dbBind[0].obValue = 0;

dbBind[1].iOrdinal = 2;

dbBind[1].wType = DBTYPE_WSTR;

dbBind[1].pTypeInfo= NULL;

dbBind[1].pBindExt = NULL;

dbBind[1].pObject = NULL;

dbBind[1].dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS;

dbBind[1].pVarData = NULL;

dbBind[1].obLength = sizeof(tchName);

dbBind[1].obStatus = dbBind[1].obLength + dbBind[1].cbMaxLen;

dbBind[1].cbMaxLen = sizeof(tchSex);

dbBind[1].obValue = dbBind[1].obStatus + dbBind[1].cbMaxLen;

dbBind[2].iOrdinal = 3;

dbBind[2].wType = DBTYPE_WSTR;

dbBind[2].pTypeInfo= NULL;

dbBind[2].pBindExt = NULL;

dbBind[2].pObject = NULL;

dbBind[2].dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS;

dbBind[2].pVarData = NULL;

dbBind[2].obLength = sizeof(tchName) + sizeof(tchSex);

dbBind[2].obStatus = dbBind[2].obLength + dbBind[2].cbMaxLen;

dbBind[2].cbMaxLen = sizeof(tchAge);

dbBind[2].obValue = dbBind[2].obStatus + dbBind[2].cbMaxLen;

hr = pIRowset -> CreateAccessor(DBACCESSOR_ROWDATA, sizeof(dbBind)/sizeof(dbBind[0]), dbBind, 0, &hAccessor, NULL);

if (FAILED(hr)) {

printf("CreateAccessor() failed!\n");

return -1;

}

//检索数据

while(hr != DB_S_ENDOFROWSET) {

hr = pIRowset -> GetData(hRow, hAccessor, buffer);

if (SUCCEEDED(hr)) {

tmemcpy(tchName, (TCHAR *)(buffer + dbBind[0].obValue), dbBind[0].cbMaxLen);

tmemcpy(tchSex , (TCHAR *)(buffer + dbBind[1].obValue), dbBind[1].cbMaxLen);

tmemcpy(tchAge , (TCHAR *)(buffer + dbBind[2].obValue), dbBind[2].cbMaxLen);

printf("%s\t%s\t%s\n", tchName, tchSex, tchAge);

}

}

//释放资源

ReleaseResource();

system("pause");

return 0;

}

好啦,上面就是关于使用C语言连接OleDbConnection数据库的全部操作步骤啦!在实际使用中,还是要多花时间多练习,熟能生巧嘛! www.0574web.net 宁波海美seo网络优化公司 是网页设计制作,网站优化,企业关键词排名,网络营销知识和开发爱好者的一站式目的地,提供丰富的信息、资源和工具来帮助用户创建令人惊叹的实用网站。 该平台致力于提供实用、相关和最新的内容,这使其成为初学者和经验丰富的专业人士的宝贵资源。

点赞(100) 打赏

声明本文内容来自网络,若涉及侵权,请联系我们删除! 投稿需知:请以word形式发送至邮箱18067275213@163.com

评论列表 共有 6 条评论

大雁养老 10月前 回复TA

博主的分享的东西真的很是在有实用,可以学要很多的东西需要慢慢的吸收

李闯城 10月前 回复TA

无语,刚想把网址.goodcrusher.com放进去,看来不能了,小失落!

江西成考网 1年前 回复TA

不管有没有用,还是要留下踪迹的

门式起重机 1年前 回复TA

如果follow和nofollow一起加进去,会怎么样?

Sean 1年前 回复TA

厉害,更清晰简单 ,谷歌优化 非常棒

龙五博客 1年前 回复TA

很不错的分享经验

立即
投稿
发表
评论
返回
顶部