日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用OLEDB编程

發(fā)布時(shí)間:2024/4/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用OLEDB编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文整理自博客:http://gamebabyrocksun.blog.163.com/blog/static/571534632008101083957499/

一,打開(kāi)數(shù)據(jù)庫(kù)連接

1,要完成一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)任務(wù),第一步則是打開(kāi)連接,在OLEDB2.0以前的版本中,可以如下操作:

#define COM_NO_WINDOWS_H //如果已經(jīng)包含了Windows.h或不使用其他Windows 庫(kù)函數(shù)時(shí)
#define DBINITCONSTANTS
#define INITGUID
#define OLEDBVER 0x0250

#include <oledb.h>
#include <oledberr.h>

IDBInitialize *pIDBInitialize = NULL;
CoCreateInstance(CLSID_MSDASQL, NULL,CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);

?

如果你使用的是SQL Server 2005以上的數(shù)據(jù)庫(kù),則有以下可選方式:

#include <sqlncli.h>

CoCreateInstance( CLSID_SQLNCLI10,NULL,CLSCTX_INPROC_SERVER, IID_IDBInitialize,(void **) &pIDBInitialize);

這是OLEDB2.0以前的做法。

在OLEDB2.0以后,推出了以下兩個(gè)接口:IDataInitialize和IDBPromptInitialize,其中,后者將彈出以下對(duì)話框:

其創(chuàng)建代碼如下:

IDBPromptInitialize* pIDBPromptInitialize = NULL;
CoCreateInstance(CLSID_DataLinks, NULL, CLSCTX_INPROC_SERVER, IID_IDBPromptInitialize, (void **)&pIDBPromptInitialize);

IDBInitialize *pIDBInitialize = NULL;
//下面這句將彈出前面所說(shuō)的對(duì)話框
pIDBPromptInitialize->PromptDataSource(NULL, hWndParent, DBPROMPTOPTIONS_PROPERTYSHEET, 0, NULL, NULL, IID_IDBInitialize (IUnknown **)&pIDBInitialize);
pIDBInitialize->Initialize();//根據(jù)對(duì)話框采集的參數(shù)連接到指定的數(shù)據(jù)庫(kù)

IDataInitialize的使用方法如下:

IDataInitialize* pIDataInitialize = NULL;

CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, IID_IDataInitialize,(void**)&pIDataInitialize);

IDBInitialize *pIDBInitialize = NULL;
pIDataInitialize->CreateDBInstance(CLSID_MSDASQL, NULL, CLSCTX_INPROC_SERVER, NULL, IID_IDBInitialize (IUnknown**)&pIDBInitialize);

?2,在創(chuàng)建了IDBInitialize接口之后(使用IDBPromptInitialize這種方式創(chuàng)建的除外),我們需要詳細(xì)指定連接數(shù)據(jù)的各種參數(shù),在OLEDB中這些參數(shù)稱為屬性,屬性以組劃分,每組屬性稱為屬性集合。

1 DBPROP InitProperties[4];
2 DBPROPSET rgInitPropSet[1];
3
4 //初始化屬性值變量
5 for ( i = 0 ; i < 4 ; i++ )
6 {
7 VariantInit(&InitProperties[i].vValue);
8 }
9
10 //指定數(shù)據(jù)庫(kù)實(shí)例名,這里使用了別名local,指定本地默認(rèn)實(shí)例
11 InitProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
12 InitProperties[0].vValue.vt = VT_BSTR;
13 InitProperties[0].vValue.bstrVal= SysAllocString(L"(local)");
14 InitProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
15 InitProperties[0].colid = DB_NULLID;
16
17 //指定數(shù)據(jù)庫(kù)名
18 InitProperties[1].dwPropertyID = DBPROP_INIT_CATALOG;
19 InitProperties[1].vValue.vt = VT_BSTR;
20 InitProperties[1].vValue.bstrVal = SysAllocString(L"MyTest");
21 InitProperties[1].dwOptions = DBPROPOPTIONS_REQUIRED;
22 InitProperties[1].colid = DB_NULLID;
23
24 //指定身份驗(yàn)證方式為集成安全模式“SSPI”
25 InitProperties[2].dwPropertyID = DBPROP_AUTH_INTEGRATED;
26 InitProperties[2].vValue.vt = VT_BSTR;
27 InitProperties[2].vValue.bstrVal = SysAllocString(L"SSPI");
28 InitProperties[2].dwOptions = DBPROPOPTIONS_REQUIRED;
29 InitProperties[2].colid = DB_NULLID;
30
31 //創(chuàng)建一個(gè)GUID為DBPROPSET_DBINIT的屬性集合,這也是初始化連接時(shí)需要的唯一一個(gè)屬性集合
32 rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
33 rgInitPropSet[0].cProperties = 4;
34 rgInitPropSet[0].rgProperties = InitProperties;
35
36 //得到數(shù)據(jù)庫(kù)初始化的屬性接口
37 IDBProperties* pIDBProperties = NULL;
38 hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
39 if (FAILED(hr))
40 {//無(wú)法得到IDBProperties接口,詳細(xì)的錯(cuò)誤信息可以使用IerrorRecords接口得到
41 return FALSE;
42 }
43
44 hr = pIDBProperties->SetProperties(1, rgInitPropSet);
45 if (FAILED(hr))
46 {//設(shè)置屬性失敗
47 return -1;
48 }
49
50 //屬性一但設(shè)置完成,相應(yīng)的接口就可以釋放了
51 pIDBProperties->Release();
52
53 //根據(jù)指定的屬性連接到數(shù)據(jù)庫(kù)
54 pIDBInitialize->Initialize();

在OLEDB中也可以通過(guò)IDataInitialize接口的GetDataSource方法來(lái)實(shí)現(xiàn),例子如下:

1 IDataInitialize* pIDataInitialize = NULL;
2 CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,
3 IID_IDataInitialize,(void**)&pIDataInitialize);
4
5 IDBInitialize *pIDBInitialize = NULL;
6 //使用連接字符串得到一個(gè)IDBInitialize接口
7 pIDataInitialize->GetDataSource(NULL, CLSCTX_INPROC_SERVER,
8 L"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\\My Document\\db1.mdb;Mode=Share Deny None;", __uuidof(IDBInitialize),
9 IUnknown**)&pIDBInitialize);
10
11 //連接到數(shù)據(jù)庫(kù)
12 pIDBInitialize ->Initialize();

?二,創(chuàng)建事務(wù)對(duì)象

在創(chuàng)建了連接對(duì)象之后,我們需要?jiǎng)?chuàng)建一個(gè)事務(wù)對(duì)象。值得注意的是,一個(gè)連接對(duì)象可以與多個(gè)事務(wù)對(duì)象相對(duì)應(yīng)。

最常用的一個(gè)事務(wù)對(duì)象接口是IOpenRowset,用于打開(kāi)一個(gè)結(jié)果集。以下代碼顯示了如何從一個(gè)數(shù)據(jù)連接對(duì)象創(chuàng)建一個(gè)IOpenRowset接口。

1 IOpenRowset* pIOpenRowSet = NULL;
2 IDBCreateSession * pIDBCreateSession = NULL;
3
4 //首先從連接對(duì)象接口找到等價(jià)的CreateSession接口
5 pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession));
6
7 //創(chuàng)建一個(gè)IOpenRowset接口
8 pIDBCreateSession->CreateSession(
9 NULL,
10 IID_IOpenRowset,
11 (Iunknown**)&pIOpenRowSet));
12
13 //與IDBInitialize等價(jià)的IDBCreateSession可以釋放了,需要時(shí)再Q(mào)uery出來(lái)就行了
14 if( pIDBCreateSession )
15 {
16 pIDBCreateSession->Release();
17 }

以上代碼通過(guò)創(chuàng)建IOpenRowset接口的方法創(chuàng)建了一個(gè)Session對(duì)象,其他的Session對(duì)象的接口可以通過(guò)QueryInterface來(lái)得到。(關(guān)于接口等價(jià)性、Session對(duì)象的接口列表,詳見(jiàn)原文:http://gamebabyrocksun.blog.163.com/blog/static/571534632008101783231453/)

值得注意的是Session對(duì)象有個(gè)IGetDataSource接口,可以通過(guò)Session對(duì)象來(lái)找回原先的數(shù)據(jù)連接對(duì)象。你可以在創(chuàng)建了IOpenRowset接口之后丟掉之前創(chuàng)建的所有接口,甚至是數(shù)據(jù)連接對(duì)象的接口,而通過(guò)IGetDataSource接口則可以方便的找回?cái)?shù)據(jù)連接對(duì)象的接口,以下代碼演示了這一過(guò)程:

1 IGetDataSource* pIGetDataSource = NULL;
2 IDBInitialize * pIDBInitialize = NULL;
3
4 pIOpenRowset->QueryInterface( IID_IGetDataSource,
5 (void**) &pIGetDataSource );
6
7 pIGetDataSource-> GetDataSource (
8 IID_IDBInitialize,(IUnknown**)&pIDBInitialize);

如同數(shù)據(jù)連接對(duì)象,Session對(duì)象也有很多屬性。你可以通過(guò)Query出ISessionProperties接口再創(chuàng)建一個(gè)屬性集并對(duì)其進(jìn)行設(shè)置,以下代碼演示了這一過(guò)程:

1 //注意Session對(duì)象只有一個(gè)屬性集合的一個(gè)屬性,就是并發(fā)級(jí)別
2 //并發(fā)級(jí)別是控制數(shù)據(jù)庫(kù)并發(fā)操作的關(guān)鍵,在OLEDB中它是一系列值的位或結(jié)果
3 //屬性:
4
5 SessionProperties[0].dwPropertyID = DBPROP_SESS_AUTOCOMMITISOLEVELS;
6
7 SessionProperties[0].vValue.vt = VT_I4;
8 SessionProperties[0].vValue.lVal= DBPROPVAL_TI_READCOMMITTED;
9 SessionProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
10 SessionProperties[0].colid = DB_NULLID;
11
12 //創(chuàng)建一個(gè)GUID為DBPROPSET_SESSION的屬性集合
13 rgSessionPropSet[0].guidPropertySet = DBPROPSET_SESSION;
14 rgSessionPropSet[0].cProperties = 1;
15 rgSessionPropSet[0].rgProperties = SessionProperties;
16
17
18
19 ISessionProperties* pISessionProperties = NULL;
20 //找到接口
21 pIOpenRowset->QueryInterface( IID_ISessionProperties, (void**) &pISessionProperties );
22
23 //設(shè)置屬性
24 pISessionProperties->SetProperties(1,rgSessionPropSet);

在Session對(duì)象的諸多接口中,如果我們要使用SQL語(yǔ)句來(lái)操作數(shù)據(jù)源,那么我們經(jīng)常使用的一個(gè)接口就是IDBCreateCommand.這個(gè)接口并不是強(qiáng)制實(shí)現(xiàn)的。這是因?yàn)?#xff1a;OLEDB的目標(biāo)就是無(wú)論應(yīng)用系統(tǒng)要使用何種數(shù)據(jù)(結(jié)構(gòu)化的如數(shù)據(jù)庫(kù)、半結(jié)構(gòu)化的如XML,無(wú)結(jié)構(gòu)化的如互聯(lián)網(wǎng)),它都能輕松勝任,而你無(wú)需再去尋找別的接口。大多數(shù)的數(shù)據(jù)源都提供了這個(gè)接口,以便對(duì)數(shù)據(jù)庫(kù)進(jìn)行SQL操作。

三,Command對(duì)象及SQL語(yǔ)句處理

1,Command對(duì)象全貌:

1 CoType TCommand
2 {
3 [mandatory] interface IAccessor;
4 [mandatory] interface IColumnsInfo;
5 [mandatory] interface ICommand;
6 [mandatory] interface ICommandProperties;
7 [mandatory] interface ICommandText;
8 [mandatory] interface IConvertType;
9 [optional] interface IColumnsRowset;
10 [optional] interface ICommandPersist;
11 [optional] interface ICommandPrepare;
12 [optional] interface ICommandWithParameters;
13 [optional] interface ISupportErrorInfo;
14 [optional] interface ICommandStream;
15 }

2,創(chuàng)建Command對(duì)象。

通常我們使用IDBCreateCommand事務(wù)接口來(lái)創(chuàng)建Command對(duì)象,也可以直接從IDBCreateSession接口創(chuàng)建。以下代碼顯示了從連接數(shù)據(jù)庫(kù)到創(chuàng)建Command對(duì)象的完整過(guò)程:

1 //1、一大堆頭文件和定義,作為前面例子代碼的一個(gè)相對(duì)完整的總結(jié)
2
3 #define COM_NO_WINDOWS_H //如果已經(jīng)包含了Windows.h或不使用其他Windows庫(kù)函數(shù)時(shí)
4 #define DBINITCONSTANTS
5 #define INITGUID
6 #define OLEDBVER 0x0250
7
8 #include "oledb.h" // OLE DB Header
9 #include "oledberr.h" // OLE DB Errors
10 #include "msdasc.h" // OLE DB Service Component header
11 #include "msdaguid.h" // OLE DB Root Enumerator
12 #include "msdasql.h" // MSDASQL - Default provider
13 int main()
14 {
15 CoInitialize(NULL);
16 //2、創(chuàng)建IDataInitialize接口
17 IDataInitialize* pIDataInitialize = NULL;
18 CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,
19 IID_IDataInitialize,(void**)&pIDataInitialize);
20
21 IDBProperties *pIDBProperties = NULL;
22 IDBInitialize *pIDBInitialize = NULL;
23
24 //2、直接創(chuàng)建IDBProperties接口
25 pIDataInitialize->CreateDBInstance(CLSID_MSDASQL, NULL,
26 CLSCTX_INPROC_SERVER, NULL, IID_IDBProperties,
27 (IUnknown**)&pIDBProperties);
28
29 //3、定義屬性集合,屬性(略),設(shè)置屬性
30 ......
31 //4、連接到數(shù)據(jù)源
32 pIDBProperties->QueryInterface(IID_IDBInitialize,(void**)&pIDBInitialize);
33 pIDBInitialize->Initialize();
34
35 //5、得到事務(wù)對(duì)象
36 IDBCreateSession* pIDBCreateSession = NULL;
37 pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)& pIDBCreateSession);
38
39 //注意這次直接創(chuàng)建了IDBCreateCommand對(duì)象作為事務(wù)對(duì)象,注意一般情況下因?yàn)檫@個(gè)接口是個(gè)可選接口,所以直接創(chuàng)建有可能會(huì)失敗,所以要檢驗(yàn)返回值
40 //在這一系列文章中我省略這些檢驗(yàn)性的操作,在實(shí)際的代碼中一定要包含豐富的錯(cuò)誤處理代碼,有關(guān)錯(cuò)誤處理的話題我將在以后的專門(mén)文章中詳細(xì)闡述,這里先
41 //聚焦于我們所關(guān)心的問(wèn)題
42
43 IDBCreateCommand* pIDBCreateCommand = NULL;
44 pIDBCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pIDBCreateCommand);
45
46 //6、創(chuàng)建Command對(duì)象,我們直接創(chuàng)建ICommandText接口
47 ICommandText* pICommandText = NULL;
48 pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
49
50 ......
51 }

在Command對(duì)象中,ICommandText接口實(shí)際是從ICommand接口派生而來(lái)的,因此,ICommandText接口實(shí)際包括了ICommand接口的全部方法。ICommandText接口有如下方法:

1 HRESULT SetCommandText(REFGUID rguidDialect,LPCOLESTR pwszCommand);
2 HRESULT GetCommandText(GUID* pguidDialect,LPOLESTR* ppwszCommand);
3
4 //以下的方法實(shí)際也是ICommand的方法:
5
6 HRESULT Cancel();
7 HRESULT Execute(IUnknown* pUnkOuter,REFIID riid,DBPARAMS* pParams,
8 DBROWCOUNT *pcRowsAffected,IUnknown** ppRowset);
9 HRESULT GetDBSession(REFIID riid,IUnknown** ppSession);

以下語(yǔ)法顯示了如果設(shè)置和執(zhí)行一個(gè)SQL語(yǔ)句:

1 TCHAR* pSQL = _T("Select * From SomeTable");
2
3 pICommandText->SetCommandText(DBGUID_DEFAULT,pSQL);
4 IRowset* pIRowset = NULL;
5
6 pICommandText->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown**)&pIRowset);

以下方法演示了如果一次執(zhí)行多條SQL語(yǔ)句:

1 TCHAR* pSQL = _T("Select * From SomeTable1\nSelect * From SomeTable2");
2
3 pICommandText->SetCommandText(DBGUID_DEFAULT,pSQL);
4
5 IMultipleResults* pIMultipleResults = NULL;
6
7 pICommandText->Execute(NULL,IID_IMultipleResults,NULL,NULL , (IUnknown**)& pIMultipleResults);

MultipleResults對(duì)象只有IMultipleResults這一個(gè)接口,可以通過(guò)其得到多個(gè)結(jié)果集對(duì)象及其接口(IRowset)。一般情況下,作為自己對(duì)OLEDB的封裝或是應(yīng)用,都應(yīng)用使用IMultipleResults接口,而不是直接使用IRowset。這樣做的好處是,你既可以一次只執(zhí)行一條SQL語(yǔ)句,也可以一次執(zhí)行多條SQL語(yǔ)句。以下代碼顯示了這一特性的使用:

1 IMultipleResults* pIMultipleResults = NULL;
2 pICommandText->Execute(NULL,IID_IMultipleResults,NULL,NULL,(IUnknown**)& pIMultipleResults);
3
4 IRowset* pIRowset = NULL;
5 DBROWCOUNT cRowsAffected = 0;//注意不要被這個(gè)參數(shù)迷惑大多數(shù)情況下它是沒(méi)用的,并不能通過(guò)它知道結(jié)果集中實(shí)際包含多少行。循環(huán)處理每一個(gè)結(jié)果集,當(dāng)然這需要你起碼知道你執(zhí)行SQL語(yǔ)句的順序
6 while( S_OK == pIMultipleResults->GetResult(NULL,
7 DBRESULTFLAG_DEFAULT,
8 IID_IRowset,
9 cRowsAffected,
10 (IUnknown**)&pIRowset) )
11 {
12 ......//處理每一個(gè)IRowset
13 pIRowset->Release();
14 pIRowset = NULL;
15 }


Command對(duì)象也有自己的屬性集,其屬性會(huì)影響因執(zhí)行SQL語(yǔ)句而得到的結(jié)果集對(duì)象的屬性(這不同于先前的兩個(gè)對(duì)象),比如結(jié)果集是否可以修改,是否可以插入,是否可以更新等等。此外,需要注意的是,一個(gè)事務(wù)對(duì)象可以創(chuàng)建n個(gè)命令對(duì)象。以下代碼顯示了如果設(shè)置命令對(duì)象(其實(shí)是結(jié)果集對(duì)象)的屬性:

1 DBPROPSET ps[1];
2 DBPROP prop[2];
3
4 prop[0].dwPropertyID = DBPROP_UPDATABILITY;
5 prop[0].vValue.vt = VT_I4;
6 prop[0].vValue.lVal=DBPROPVAL_UP_CHANGE //打開(kāi)Update屬性
7 |DBPROPVAL_UP_DELETE //打開(kāi)Delete屬性
8 |DBPROPVAL_UP_INSERT; //打開(kāi)Insert屬性
9
10 prop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
11 prop[0].colid = DB_NULLID;
12 ps[0].guidPropertySet = DBPROPSET_ROWSET; //注意屬性集合的名稱
13 ps[0].cProperties = 1;
14 ps[0].rgProperties = prop;
15
16 ICommandProperties * pICommandProperties = NULL;
17 pICommandText->QueryInterface(IID_ICommandProperties,
18 (void**)& pICommandProperties);
19 pICommandProperties->SetProperties(1,ps);//注意必須在Execute前設(shè)定屬性
20
21 IRowset* pIRowset = NULL;
22 pICommandText->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown**)&pIRowset)

以上代碼演示了如何打開(kāi)五個(gè)帶有更新、插入、刪除屬性的結(jié)果集。這樣,我們可以直接利用結(jié)果集對(duì)象的相關(guān)方法來(lái)修改數(shù)據(jù)并提交,同時(shí)可以繞過(guò)使用等價(jià)的SQL語(yǔ)句(UPDATE, DELETE, INSERT等),而是使用純粹代碼的方式修改數(shù)據(jù)并提交到數(shù)據(jù)庫(kù),這種方式要比直接使用SQL語(yǔ)句更加高效。

四,處理結(jié)果集

1,關(guān)于Rowset和MutipleResults對(duì)象的接口列表,可以參見(jiàn)原文:http://gamebabyrocksun.blog.163.com/blog/static/57153463200811882756317/

在Rowset對(duì)象中,我們經(jīng)常使用的接口就是IRowset, IColumnInfo和IAccessor。通過(guò)這幾個(gè)接口,才可以訪問(wèn)到我們查詢得到的數(shù)據(jù)結(jié)果。這個(gè)過(guò)程通常很復(fù)雜。

2,得到結(jié)果集:

pICommandText->Execute(NULL,IID_IRowset,NULL,NULL (IUnknown**)&pIRowset)

3,得到列信息:

通過(guò)列信息可以知道結(jié)果集的完整數(shù)據(jù)結(jié)果,這為后續(xù)的創(chuàng)建訪問(wèn)器、準(zhǔn)備數(shù)據(jù)緩沖奠定了基礎(chǔ)。多數(shù)時(shí)候,在SQL的查詢語(yǔ)句是是沒(méi)有關(guān)于數(shù)據(jù)結(jié)構(gòu)的信息的,這個(gè)信息是隱含在數(shù)據(jù)庫(kù)中的,而我們查詢得到結(jié)果集時(shí)就必須要知道這個(gè)數(shù)據(jù)結(jié)構(gòu)的信息,否則對(duì)數(shù)據(jù)的訪問(wèn)就無(wú)從談起。這個(gè)過(guò)程通過(guò)IColumnsInfo接口實(shí)現(xiàn)。以下代碼演示了如何得到列信息:

1 IColumnsInfo * pIColumnsInfo = NULL;
2 ULONG cColumns = 0;
3 DBCOLUMNINFO * rgColumnInfo = NULL;
4 LPWSTR pStringBuffer = NULL;
5
6 HRESULT hr = pIRowset->QueryInterface(IID_IColumnsInfo,(void**)&pIColumnsInfo));
7
8 hr = pIColumnsInfo->GetColumnInfo(&cColumns, &rgColumnInfo, &pStringBuffer));
9
10 //如果成功了,那么rgColumnInfo中已經(jīng)包含了一個(gè)關(guān)于列信息數(shù)據(jù)結(jié)構(gòu)的數(shù)組,
11 //數(shù)組元素的個(gè)數(shù)即cColumns 也就是最終的列數(shù)
12 //使用完畢后釋放所有的資源及接口
13 CoTaskMemFree(rgColumnInfo);
14 CoTaskMemFree(pStringBuffer);
15 if( NULL != pIColumnsInfo )
16 {
17 pIColumnsInfo->Release();
18 }

這里使用了CoTaskMemFree這個(gè)COM庫(kù)函數(shù)來(lái)完成對(duì)rgColumnInfo和pStringBuffer內(nèi)存的釋放。注意,在OLEDB的幫助文檔中說(shuō)要使用IMalloc接口的Free方法來(lái)釋放。其實(shí)二者是等價(jià)的。在使用CoTaskMemFree這個(gè)函數(shù)時(shí),并不需要檢查被釋放的指針是否為空,它內(nèi)部有檢查是否為空的機(jī)制,直接調(diào)用即可。

DBCOLUMNINFO這個(gè)結(jié)構(gòu)的原型如下:

1 typedef struct tagDBCOLUMNINFO
2 {
3 LPOLESTR pwszName;
4 ITypeInfo *pTypeInfo;
5 DBORDINAL iOrdinal;
6 DBCOLUMNFLAGS dwFlags;
7 DBLENGTH ulColumnSize;
8 DBTYPE wType;
9 BYTE bPrecision;
10 BYTE bScale;
11 DBID columnid;
12 }DBCOLUMNINFO;

pswzName:字段名稱,為UNICODE字符串。如果查詢中沒(méi)有明確為列指定名稱時(shí),這個(gè)字段為空,即沒(méi)有列名。

pTypeInfo:保留接口,一般為NULL。

iOrdinal:字段在結(jié)果集中的序號(hào),即表示該字段是結(jié)果集的第幾列。從1開(kāi)始,序號(hào)0是為一些特殊用途保留的(比如結(jié)果集的書(shū)簽功能)。

dwFlags:描述了列的狀態(tài)。其類型為DBCOLUMNFLAGS,是個(gè)枚舉類型,在MSDN中可以找到詳細(xì)描述。

ulColumnSize:列的大小,單位為字節(jié)。需要注意的是,這個(gè)大小僅對(duì)字符型列(即wType = DBTYPE_STR或wType = DBTYPE_WSTR)有意義。而對(duì)于其他類型的字段則設(shè)置為一個(gè)~0值(即FFFFFFFF)。

wType:結(jié)果集列的數(shù)據(jù)類型。OLEDB中定義了完整的被支持的數(shù)據(jù)類型,此處將所有類型含義及欺直列出如下:

1 enum DBTYPEENUM
2 {
3 // The following values exactly match VARENUM
4 // in Automation and may be used in VARIANT.
5 DBTYPE_EMPTY = 0,
6 DBTYPE_NULL = 1,
7 DBTYPE_I2 = 2,
8 DBTYPE_I4 = 3,
9 DBTYPE_R4 = 4,
10 DBTYPE_R8 = 5,
11 DBTYPE_CY = 6,
12 DBTYPE_DATE = 7,
13 DBTYPE_BSTR = 8,
14 DBTYPE_IDISPATCH = 9,
15 DBTYPE_ERROR = 10,
16 DBTYPE_BOOL = 11,
17 DBTYPE_VARIANT = 12,
18 DBTYPE_IUNKNOWN = 13,
19 DBTYPE_DECIMAL = 14,
20 DBTYPE_UI1 = 17,
21 DBTYPE_ARRAY = 0x2000,
22 DBTYPE_BYREF = 0x4000,
23 DBTYPE_I1 = 16,
24 DBTYPE_UI2 = 18,
25 DBTYPE_UI4 = 19,
26
27 // The following values exactly match VARENUM in Automation but cannot be used in VARIANT.
28 DBTYPE_I8 = 20,
29 DBTYPE_UI8 = 21,
30 DBTYPE_GUID = 72,
31 DBTYPE_VECTOR = 0x1000,
32 DBTYPE_FILETIME = 64,
33 DBTYPE_RESERVED = 0x8000,
34
35 // The following values are not in VARENUM in OLE.
36 DBTYPE_BYTES = 128,
37 DBTYPE_STR = 129,
38 DBTYPE_WSTR = 130,
39 DBTYPE_NUMERIC = 131,
40 DBTYPE_UDT = 132,
41 DBTYPE_DBDATE = 133,
42 DBTYPE_DBTIME = 134,
43 DBTYPE_DBTIMESTAMP = 135
44 DBTYPE_HCHAPTER = 136
45 DBTYPE_PROPVARIANT = 138,
46 DBTYPE_VARNUMERIC = 139
47 };

需要特別注意的是,這里的數(shù)據(jù)類型不是數(shù)據(jù)庫(kù)支持的數(shù)據(jù)類型,或者說(shuō)并不是所有的數(shù)據(jù)庫(kù)都支持這些所有的數(shù)據(jù)類型,這僅是一個(gè)所有可能數(shù)據(jù)類型的全部概括,當(dāng)然也有一些數(shù)據(jù)庫(kù)中的類型并不在這個(gè)列表中,這時(shí)往往數(shù)據(jù)庫(kù)對(duì)應(yīng)的OLEDB接口提供程序都做了很好的轉(zhuǎn)換,已經(jīng)轉(zhuǎn)換成了這個(gè)列表中所具有的類型,因此不用擔(dān)心會(huì)碰到不支持的數(shù)據(jù)類型。

bPrecision:精度。

bScale:小數(shù)位數(shù)。

columnid:該列在數(shù)據(jù)庫(kù)系統(tǒng)字典表中的id號(hào)。

4,創(chuàng)建綁定:

綁定是OLEDB中最重要最核心的概念之一,它是我們?cè)L問(wèn)數(shù)據(jù)的關(guān)鍵操作。對(duì)其最簡(jiǎn)單的理解就是:安排得到數(shù)據(jù)的內(nèi)存擺放方式,并將這一方式告訴數(shù)據(jù)提供者,讓它按要求將數(shù)據(jù)擺放到我們指定的內(nèi)存中。為此,我們就需要自己創(chuàng)建一個(gè)被稱作DBBINDING的數(shù)組,該結(jié)構(gòu)體聲明如下:

1 typedef struct tagDBBINDING
2 {
3 DBORDINAL iOrdinal;
4 DBBYTEOFFSET obValue;
5 DBBYTEOFFSET obLength;
6 DBBYTEOFFSET obStatus;
7 ITypeInfo *pTypeInfo;
8 DBOBJECT *pObject;
9 DBBINDEXT *pBindExt;
10 DBPART dwPart;
11 DBMEMOWNER dwMemOwner;
12 DBPARAMIO eParamIO;
13 DBLENGTH cbMaxLen;
14 DWORD dwFlags;
15 DBTYPE wType;
16 BYTE bPrecision;
17 BYTE bScale;
18 } DBBINDING;

可以看出,這個(gè)結(jié)構(gòu)和前面的DBCOLUMNINFO結(jié)構(gòu)很相似。其實(shí)它們的字段大多數(shù)確實(shí)是一致的,甚至可以直接使用DBCOLUMNINFO對(duì)DBBINDING進(jìn)行賦值。但是二者字段的含義是完全不同的。首先DBCOLUMNINFO是數(shù)據(jù)提供者給你的信息,它是固定的,對(duì)相同的查詢來(lái)說(shuō),列總是相同的,因此數(shù)據(jù)提供者返回的DBCOLUMNINFO數(shù)組也是固定的。而DBBINDING是你作為數(shù)據(jù)消費(fèi)者創(chuàng)建之后給數(shù)據(jù)提供者的一個(gè)結(jié)構(gòu)數(shù)組,它的內(nèi)容完全有你來(lái)控制。通過(guò)這個(gè)結(jié)構(gòu)我們可以指定數(shù)據(jù)提供者最終將數(shù)據(jù)擺放成我們指定的格式,或者進(jìn)行指定的數(shù)據(jù)類型轉(zhuǎn)換。以下例子展示了如何完成這個(gè)過(guò)程:

1 ULONG cColumns;
2 DBCOLUMNINFO * rgColumnInfo = NULL;
3 LPWSTR pStringBuffer = NULL;
4
5 IColumnsInfo * pIColumnsInfo = NULL;
6 ULONG iCol;
7 ULONG dwOffset = 0;
8 DBBINDING * rgBindings = NULL;
9
10 pIRowset->QueryInterface(IID_IColumnsInfo,(void**)&pIColumnsInfo));
11 pIColumnsInfo->GetColumnInfo(&cColumns, &rgColumnInfo,&pStringBuffer));
12
13 rgBindings = (DBBINDING*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,cColumns * sizeof(DBBINDING));
14 for( iCol = 0; iCol < cColumns; iCol++ )
15 {
16 rgBindings[iCol].iOrdinal = rgColumnInfo[iCol].iOrdinal;
17 rgBindings[iCol].dwPart = DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS;
18 rgBindings[iCol].obStatus = dwOffset;
19 rgBindings[iCol].obLength = dwOffset + sizeof(DBSTATUS);
20 rgBindings[iCol].obValue = dwOffset+sizeof(DBSTATUS)+sizeof(ULONG);
21 rgBindings[iCol].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
22 rgBindings[iCol].eParamIO = DBPARAMIO_NOTPARAM;
23 rgBindings[iCol].bPrecision = rgColumnInfo[iCol].bPrecision;
24 rgBindings[iCol].bScale = rgColumnInfo[iCol].bScale;
25 rgBindings[iCol].wType = rgColumnInfo[iCol].wType;
26 rgBindings[iCol].cbMaxLen = rgColumnInfo[iCol].ulColumnSize;
27 dwOffset = rgBindings[iCol].cbMaxLen + rgBindings[iCol].obValue;
28 dwOffset = ROUNDUP(dwOffset);
29 }
30
31 CoTaskMemFree(rgColumnInfo);
32 CoTaskMemFree(pStringBuffer);
33
34 if( pIColumnsInfo )
35 {
36 pIColumnsInfo->Release();
37 }

需要注意的是用紅色標(biāo)的四行。其中第一句指明數(shù)據(jù)提供者最終提交數(shù)據(jù)時(shí)必須包含的信息,這里指定了列值(DBPART_VALUE),長(zhǎng)度(DBPART_LENGTH)和狀態(tài)(DBPART_STATUS)共3個(gè)信息,列值不用說(shuō)就是要放字段的最終結(jié)果值,長(zhǎng)度就是這個(gè)字段占用的字節(jié)長(zhǎng)度,列狀態(tài)中將存放的是值的狀態(tài)比如是否為空等。

后面3句則明確的指出了以上三個(gè)信息在內(nèi)存中擺放的偏移位置,通常按習(xí)慣,我們要求數(shù)據(jù)提供者先擺放狀態(tài),再擺放長(zhǎng)度,最后擺放數(shù)據(jù)。

5,創(chuàng)建訪問(wèn)器:
有了綁定結(jié)構(gòu)之后,接下來(lái)的工作就是通知數(shù)據(jù)提供者按照我們的要求對(duì)數(shù)據(jù)進(jìn)行“格式化”。這個(gè)過(guò)程就是創(chuàng)建一個(gè)訪問(wèn)器。創(chuàng)建訪問(wèn)器就要使用IAccessor接口,同樣這個(gè)接口也是從IRowset查詢得來(lái),代表訪問(wèn)器的標(biāo)志則是一個(gè)類型為HACCESSOR的句柄。以下代碼演示了如果創(chuàng)建一個(gè)訪問(wèn)器:

1 HACCESSOR * phAccessor,
2 IAccessor * pIAccessor = NULL;
3
4 pIRowset->QueryInterface(IID_IAccessor,(void**)&pIAccessor));
5 pIAccessor->CreateAccessor( DBACCESSOR_ROWDATA,cColumns,rgBindings,0,phAccessor,NULL));
6 if( pIAccessor )
7 {
8 pIAccessor->Release();
9 }

在這段代碼中,我們最后直接釋放了IAccessor接口,表示創(chuàng)建了訪問(wèn)器后這個(gè)接口也就沒(méi)有用了。如果需要我們其實(shí)也可以隨時(shí)從同一IRowset接口再查詢出這個(gè)接口。因?yàn)檫@兩個(gè)接口所表示的結(jié)果集對(duì)象是同一個(gè)。

6,得到數(shù)據(jù):

以下代碼演示了得到數(shù)據(jù)的過(guò)程:

1 void * pData = NULL;
2 ULONG cRowsObtained;
3 HROW * rghRows = NULL;
4 ULONG iRow;
5 LONG cRows = 10;//一次讀取10行
6 void * pCurData;
7
8 //分配cRows行數(shù)據(jù)的緩沖,然后反復(fù)讀取cRows行到這里,然后逐行處理之
9 pData = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwOffset * cRows);
10 while( S_OK == pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0,cRows,&cRowsObtained, &rghRows)) )
11 {//循環(huán)讀取數(shù)據(jù),每次循環(huán)默認(rèn)讀取cRows行,實(shí)際讀取到cRowsObtained行
12 for( iRow = 0; iRow < cRowsObtained; iRow++ )
13 {
14 pCurData = (BYTE*)pData + (dwOffset * iRow);
15 pIRowset->GetData( rghRows[iRow],hAccessor,pCurData));
16 //pCurData中已經(jīng)包含了結(jié)果數(shù)據(jù),顯示或者進(jìn)行處理
17 ......
18 }
19 if( cRowsObtained )
20 {//釋放行句柄數(shù)組
21 pIRowset->ReleaseRows(cRowsObtained,rghRows,NULL,NULL,NULL));
22 }
23 CoTaskMemFree(rghRows);
24 rghRows = NULL;
25 }
26 HeapFree(GetProcessHeap(),0,pData);
27 if( pIRowset )
28 {
29 pIRowset->Release();
30 }

代碼中,HROW表示行的句柄,這里使用的是HROW的數(shù)據(jù),讀出了多少行,數(shù)組中應(yīng)有多少行的句柄,然后再使用句柄調(diào)用GetData將數(shù)據(jù)讀到指定的內(nèi)存位置。最后每次都釋放了這個(gè)數(shù)據(jù),因?yàn)閿?shù)據(jù)已經(jīng)詩(shī)刊了我們分配的緩存中,這個(gè)句柄數(shù)組也就沒(méi)有什么意義了。最終數(shù)據(jù)讀取完畢,我們也就釋放了IRowset接口。

EOF。

轉(zhuǎn)載于:https://www.cnblogs.com/cmleung/archive/2012/03/22/2411646.html

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的使用OLEDB编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

欧美一级电影免费观看 | 欧美成人一区二区 | 久久国产精品区 | 视频一区二区三区视频 | 一区二区三区在线免费观看 | 日韩免费在线 | 国产精品美女久久久久久久 | 日本在线观看一区 | 伊人天堂久久 | 日日夜夜天天射 | 91精品麻豆 | 久久久久久黄色 | 久久综合毛片 | 欧美日韩精品在线播放 | 色av男人的天堂免费在线 | 特级毛片网| 精品国产一区二区三区男人吃奶 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 精品免费观看 | 欧美日产在线观看 | 日韩精品在线免费观看 | 大荫蒂欧美视频另类xxxx | 伊人资源站 | 麻豆91精品91久久久 | 五月天久久久久久 | 一区二区三区在线电影 | 日本久久中文字幕 | 免费a一级 | 国偷自产中文字幕亚洲手机在线 | 久草视频在 | 91在线中字 | 色婷婷激情五月 | 91av视频在线观看免费 | 99精品视频免费观看视频 | 伊人va | 精品国产福利在线 | 亚洲精品中文字幕在线观看 | 欧美日韩在线观看一区二区 | 亚洲影视九九影院在线观看 | 欧美日产在线观看 | 一区二区三区视频在线 | 精品国产aⅴ麻豆 | 成人av资源在线 | 久久久免费在线观看 | 亚洲天堂精品视频在线观看 | 成人黄色片免费 | 亚洲综合在线发布 | 欧美精品久久天天躁 | 天天射天天射 | 在线探花| 欧洲精品久久久久毛片完整版 | 久久avav| 国产伦精品一区二区三区… | 色综合天天综合网国产成人网 | japanese黑人亚洲人4k | 男女精品久久 | 色在线高清 | 久久免费视频1 | 91在线中文字幕 | 日韩欧美一区二区三区在线 | 亚洲资源 | 狠狠色丁香婷综合久久 | 狠狠色丁香 | 青青网视频 | 天堂视频中文在线 | 涩涩网站在线播放 | 91久久奴性调教 | 99久久精品国产观看 | 欧美另类美少妇69xxxx | 欧洲色综合 | 91av在线看 | 日日干夜夜干 | 国产精选在线观看 | 色www免费视频 | 欧美性生交大片免网 | 日韩精品一区在线播放 | 欧美三级高清 | 精品国产一区二区三区久久 | 视频一区视频二区在线观看 | 国产一区高清在线观看 | 美女视频黄免费的 | 欧美色图亚洲图片 | 一级欧美一级日韩 | 久久永久视频 | 久久久久久久久综合 | 91成人天堂久久成人 | 欧美激情精品 | 中文字幕亚洲在线观看 | 一本大道久久精品懂色aⅴ 五月婷社区 | 最近日本韩国中文字幕 | 三级av网| 日日干av | 婷婷激情综合网 | 久久99精品久久久久久三级 | 国产精品久久久久久久电影 | 天天超碰 | 久久免费视频在线 | 69av久久| 色综合咪咪久久网 | 久久综合九色综合97婷婷女人 | 91精品国产麻豆国产自产影视 | 国产免费一区二区三区网站免费 | 日夜夜精品视频 | 婷婷中文字幕 | 亚洲v欧美v国产v在线观看 | 国产精品久99 | 国产一区二区三区免费视频 | 日韩精品一区二区三区水蜜桃 | 98精品国产自产在线观看 | 免费福利在线播放 | 亚洲黄网址| 精品视频| 日韩电影在线观看中文字幕 | 密桃av在线 | 欧美视频日韩视频 | 人人插人人费 | www.久艹| 成年人在线观看视频免费 | 久久极品 | 日韩精品国产一区 | 丁香花在线视频观看免费 | av免费看在线 | 久久人人爽人人人人片 | 久久涩视频 | 久久午夜网 | 国产中文字幕在线播放 | 日韩av片免费在线观看 | av丝袜在线| 免费观看丰满少妇做爰 | 丁香花在线观看免费完整版视频 | 玖玖在线精品 | 香蕉在线视频播放网站 | 国产在线一区二区三区播放 | 色综合欧洲 | 久久久久99999 | 免费男女羞羞的视频网站中文字幕 | www.夜夜| www.天天草| 香蕉在线影院 | 天天干天天干天天干天天干天天干天天干 | 日韩小视频 | 亚洲精品视频第一页 | 永久精品视频 | 天天搞天天 | 中文字幕在线观看视频免费 | av软件在线观看 | 国产精品免费在线 | 天天·日日日干 | 一级性视频 | 国产香蕉视频在线播放 | 国产精品一区久久久久 | 国产精品三级视频 | 天天干天天想 | 玖玖视频网 | 西西444www大胆高清图片 | 91成人国产| 成人在线视频免费看 | 在线亚洲小视频 | 天天干天天操天天拍 | 免费人做人爱www的视 | 国产丝袜高跟 | 欧美亚洲国产日韩 | 久操视频在线 | 狠狠操狠狠干天天操 | 精品黄色在线观看 | 国产做aⅴ在线视频播放 | 欧美激情精品久久久久久 | 国产精品1000 | 午夜久久福利 | 国产欧美日韩精品一区二区免费 | 久青草电影| 久久久久久高潮国产精品视 | 午夜精品一区二区三区可下载 | 99热这里只有精品国产首页 | 欧美一区二区免费在线观看 | 国产色一区 | 国产成人精品免高潮在线观看 | 免费福利在线 | 国产999精品久久久久久绿帽 | 国产欧美精品xxxx另类 | 91精品视频在线观看免费 | 国产不卡在线看 | 欧美成年人在线视频 | 国内精品久久久久影院男同志 | 97精品一区| 狠狠久久 | 亚洲狠狠婷婷 | 五月婷婷中文 | 亚洲视频大全 | 色先锋资源网 | 成人h动漫精品一区二 | 午夜视频在线观看一区 | 日韩乱理 | 黄色毛片在线观看 | 亚洲免费视频观看 | 91成人网在线 | 欧美精品首页 | 久久优 | 亚洲精品2区| www.香蕉视频在线观看 | 精品五月天| 欧美久久久久 | 午夜三级影院 | 天天干天天做 | 国产精品99免视看9 国产精品毛片一区视频 | 在线观av| 国产精品区二区三区日本 | 91视频91蝌蚪| 91禁看片 | 国产黄大片在线观看 | 欧美日韩亚洲在线观看 | 综合色站导航 | 99久久er热在这里只有精品66 | 黄色资源在线观看 | 中文字幕在线免费观看 | 美女很黄免费网站 | 久久av中文字幕片 | 超碰公开在线观看 | 欧美日本不卡高清 | 欧美一级性生活视频 | 婷婷成人在线 | 特级毛片网 | 欧美一级免费高清 | 中文字幕精品一区久久久久 | 美女视频一区二区 | 日韩精品免费专区 | 男女视频国产 | 国产乱对白刺激视频在线观看女王 | 在线va网站| 久久久成人精品 | 久久人91精品久久久久久不卡 | a视频免费| 一级片免费观看 | 午夜a区| 91亚色免费视频 | 一区二区激情 | 欧美日本三级 | 欧美一区二区在线看 | 日韩欧美v | 欧美 亚洲 另类 激情 另类 | 欧洲亚洲女同hd | 精品国产一区二 | 久久国产精品一国产精品 | 精品视频在线免费观看 | 国内成人av | 国产精品永久免费在线 | av成人在线网站 | 天天干天天操天天干 | 在线不卡视频 | 国产乱老熟视频网88av | 日日综合网 | 久草视频免费看 | 性色xxxxhd| 天天干天天操天天射 | 久久成人精品 | 日韩激情综合 | 日韩欧美在线播放 | 国产视频手机在线 | 激情综合婷婷 | 在线观看网站你懂的 | 69av视频在线 | 久草视频资源 | 国产精品自产拍在线观看蜜 | 久久久久久久久毛片 | 欧美一二区视频 | av高清不卡 | 国产在线 一区二区三区 | 久久国产精品二国产精品中国洋人 | 中文字幕免费观看 | 亚洲高清在线 | 色操插 | 欧美久久久久久久久中文字幕 | 国产精品免费久久久久久久久久中文 | 最近中文字幕视频网 | 91亚洲国产成人 | 97电影网站 | 免费在线观看黄 | 在线观看中文字幕第一页 | 国产精品一区二区久久久 | 国产综合视频在线观看 | 欧美影院久久 | 99久热在线精品视频成人一区 | 日韩av成人在线观看 | 国产一区二区在线影院 | 成人国产亚洲 | 免费裸体视频网 | 成人9ⅰ免费影视网站 | 午夜成人免费电影 | 中文字幕欲求不满 | 超薄丝袜一二三区 | 豆豆色资源网xfplay | 日韩免费成人 | 国产伦理一区 | 最近免费中文字幕大全高清10 | 亚洲精品免费观看 | 一区二区三区日韩在线观看 | 亚洲撸撸 | 成人九九视频 | www.伊人网.com | 色综合久久中文字幕综合网 | 亚洲国产精品一区二区久久,亚洲午夜 | 久久久99精品免费观看app | 亚洲黄色在线播放 | 狠狠色丁婷婷日日 | 91免费视频网站在线观看 | 日韩av伦理片 | 手机av看片 | 久草在线在线精品观看 | 国产精品一区二区三区久久久 | 在线观看黄 | 91大神dom调教在线观看 | 欧美性猛片, | 亚洲性xxxx | 日日夜色 | 国产中文字幕在线观看 | 国产精品嫩草在线 | 久久综合色婷婷 | 精品国产日本 | 草草草影院 | 成人夜晚看av | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 日本精品视频在线播放 | 免费看国产曰批40分钟 | 操少妇视频 | 69xxxx欧美| 九9热这里真品2 | 久草资源免费 | 成人av资源站| 欧美色精品天天在线观看视频 | 伊人狠狠| 亚洲情影院 | 亚洲高清视频在线观看免费 | 在线观看一级视频 | 中文字幕一区二区在线观看 | 521色香蕉网站在线观看 | 一区二区三区免费看 | 天天天天爱天天躁 | 99久久久国产精品 | 人人澡人人舔 | 久久视频这里有精品 | 开心综合网 | 欧美日韩在线观看一区二区三区 | 久久国产区| 99精品久久99久久久久 | 国产精品福利午夜在线观看 | 国产又黄又爽无遮挡 | 91视频啊啊啊 | 97精品超碰一区二区三区 | 看片网站黄| 久久综合给合久久狠狠色 | 午夜三级理论 | 在线亚洲成人 | 999日韩 | 在线免费av播放 | 中文字幕美女免费在线 | 91精品一区二区三区久久久久久 | 国产精品video爽爽爽爽 | 草樱av | www视频在线观看 | 亚洲一级电影视频 | 色婷婷福利视频 | 欧美片一区二区三区 | 一区二区三区免费播放 | 亚洲综合视频在线 | 欧美日韩免费在线观看视频 | 一区二区 不卡 | 五月天天av | 天天爽夜夜爽精品视频婷婷 | 久久国产综合视频 | 国产视频精品免费 | 99精品国产福利在线观看免费 | 久久久 精品 | 高清在线一区 | 国产夫妻性生活自拍 | 亚洲成人黄色 | 久久久www成人免费精品 | 国产精品一区二区三区电影 | 91中文字幕 | 日日爱夜夜爱 | 久久精品视频在线观看免费 | 黄色片视频免费 | 日韩特级毛片 | 色婷婷激情 | 国产精品嫩草影院99网站 | 日韩三级久久 | 在线视频 你懂得 | 国产视频手机在线 | 五月天婷婷视频 | 日日夜夜操操操操 | 中文字幕91视频 | 91一区啪爱嗯打偷拍欧美 | 狠狠干狠狠操 | 国产亚洲精品久久久久动 | 成人黄色在线播放 | 亚洲国产精品传媒在线观看 | 久久免费成人精品视频 | 在线看片a| 天天干视频在线 | 九色视频网 | 国产亚州av | 伊人五月天综合 | 成人午夜电影在线 | av成人免费网站 | 日韩欧美在线观看一区二区 | 精品99久久 | 日韩xxxbbb | 999电影免费在线观看 | 93久久精品日日躁夜夜躁欧美 | 久久国产亚洲视频 | 激情五月五月婷婷 | 一本—道久久a久久精品蜜桃 | 中文字幕人成人 | 国产色综合天天综合网 | 亚洲精品美女在线观看 | 免费色视频| 精品视频国产一区 | 欧美黄在线 | 色综合久久久久综合体 | 国产精品久久艹 | 一级免费观看 | 在线免费色| 亚洲精品国精品久久99热 | 97激情影院| 亚洲高清在线精品 | 欧美日韩精品网站 | www视频在线播放 | 91精品国自产在线观看欧美 | 色五月成人| 久久69精品久久久久久久电影好 | 日日干网 | 国产一区在线视频观看 | 亚洲精品无 | 国产福利在线不卡 | 蜜臀av免费一区二区三区 | 1024手机基地在线观看 | 黄色av一区二区 | 美女网站在线看 | 国产精品一区二区三区观看 | 久久撸在线视频 | 亚洲激情小视频 | 综合天堂av久久久久久久 | 国产午夜精品一区二区三区 | 午夜精品福利一区二区三区蜜桃 | 久久成人高清 | 欧美在线free | 黄色a三级 | 91精品秘密在线观看 | 996久久国产精品线观看 | 天天天操操操 | 24小时日本在线www免费的 | 91黄在线看| 日韩久久精品一区 | 国产精品一区二区在线 | 中文字幕精品一区久久久久 | 欧美人牲 | 国产精品av一区二区 | 一区二区三区在线免费播放 | 国产精品一区二区无线 | 久久手机免费视频 | 一区二区视频在线看 | 国产又粗又猛又色又黄视频 | 日韩网站中文字幕 | 日韩中文字幕a | 国产日产在线观看 | 欧美一级大片在线观看 | av黄网站 | 午夜的福利| 麻豆国产精品va在线观看不卡 | 国产夫妻性生活自拍 | 日韩精品免费一线在线观看 | 日韩欧美精品一区二区 | 岛国一区在线 | 国内精品小视频 | 日韩性色 | 亚洲丝袜一区二区 | 视频二区在线 | 天天天插| 在线免费观看涩涩 | 国产一区免费在线观看 | 中文字幕免费在线看 | 欧美另类视频 | 在线成人免费 | 亚洲成人第一区 | 久久亚洲精品电影 | 精品91| 在线观看免费一级片 | 午夜精品久久久久久久99水蜜桃 | 91久久国产综合精品女同国语 | 日韩电影在线观看一区 | 亚洲精品高清一区二区三区四区 | 成人免费视频播放 | 日本精品久久久久中文字幕5 | 最近免费中文字幕大全高清10 | 国产成人av电影 | 99热这里只有精品在线观看 | 日韩免费视频在线观看 | 亚洲精品字幕 | 九色91av| 99久久精品免费一区 | 亚洲精品在线观看av | 中国一级特黄毛片大片久久 | 免费在线色 | 亚洲永久精品在线 | 午夜影视一区 | 国产欧美三级 | 日操操 | 一本一道久久a久久精品蜜桃 | 91看片麻豆| 欧美夫妻生活视频 | 麻豆国产露脸在线观看 | 中文字幕观看av | 激情五月网站 | 欧美日韩中文字幕在线视频 | 国产一级视频在线免费观看 | 91桃花视频 | 国产裸体视频网站 | 亚洲欧美日韩国产精品一区午夜 | 九色91av| 一区二区三区精品久久久 | 日韩av片免费在线观看 | 久久精品久久国产 | 欧美性生活大片 | 国产精品免费久久久久久久久久中文 | 国产精品久久久久久久99 | 麻豆传媒电影在线观看 | 国产xvideos免费视频播放 | 视频一区二区在线 | 婷婷六月天综合 | 亚洲电影久久 | 我要看黄色一级片 | 午夜体验区 | 国产一级高清 | 国产成人在线免费观看 | 91成人在线网站 | 国产91精品看黄网站在线观看动漫 | 日韩成人精品一区二区三区 | 7777精品伊人久久久大香线蕉 | 久久婷婷一区二区三区 | 九九三级毛片 | 国产精品第7页 | www国产亚洲 | 久久久久免费网 | 日韩成人精品一区二区三区 | 九九热免费在线视频 | 日本系列中文字幕 | 国产专区一 | 免费观看久久久 | 另类老妇性bbwbbw高清 | 国产又粗又猛又色又黄视频 | 麻豆视频在线免费 | 992tv在线观看网站 | 欧美日韩高清一区 | 黄色aaaaa| 国产手机在线观看视频 | 99精品久久久久久久 | 日本三级全黄少妇三2023 | 在线免费高清视频 | 国产明星视频三级a三级点| 日韩av在线免费播放 | 亚洲欧美日韩一二三区 | 色偷偷97 | 精品美女国产在线 | 香蕉视频国产在线 | 午夜三级理论 | 蜜臀av一区二区 | 国产精品永久在线观看 | 91av蜜桃 | 成人a免费看 | 日韩精品高清视频 | 国产精品中文字幕在线 | 99视频精品 | 精品国产一区二区三区久久影院 | 中文字幕首页 | www好男人| 欧美最猛性xxxxx亚洲精品 | 91麻豆免费视频 | 国产99久久九九精品免费 | av黄色免费看 | 成年美女黄网站色大片免费看 | 国产精品女同一区二区三区久久夜 | 波多野结衣视频在线 | 国产精品精品 | 午夜久久福利影院 | 色婷婷97| 国产精品99蜜臀久久不卡二区 | 18pao国产成视频永久免费 | 69国产盗摄一区二区三区五区 | 综合久色 | 999久久久国产精品 高清av免费观看 | 国产亚洲视频在线 | 日韩三级免费 | 久久久久久久久影视 | 亚洲成aⅴ人片久久青草影院 | 国产午夜三级一二三区 | 玖玖视频免费在线 | 天天曰夜夜爽 | 国产精品美女在线观看 | 91九色蝌蚪视频在线 | 国产99久久九九精品免费 | 在线电影 你懂得 | 欧美久久久久久久久中文字幕 | 97韩国电影 | 一级成人免费视频 | av中文字幕第一页 | 中文字幕第一页在线播放 | 国产录像在线观看 | 中文字幕在线字幕中文 | 国产999精品久久久久久绿帽 | 午夜婷婷在线播放 | 久久久久久久久艹 | 一区在线播放 | 成人毛片100免费观看 | 国产明星视频三级a三级点| 久久精品一区二区三区四区 | 午夜天天操 | 精品高清美女精品国产区 | 国产免费av一区二区三区 | 99精品毛片 | 成人h动漫精品一区二 | 国产精品手机视频 | 黄色福利视频网站 | 香蕉影视app| 久章草在线 | 久久精品屋 | 亚洲麻豆精品 | 欧美在线视频一区二区三区 | 午夜av片 | 在线成人高清电影 | 91久久丝袜国产露脸动漫 | 国产在线观看91 | 热热热热热色 | 久久99精品国产 | 成人午夜精品福利免费 | 亚洲天堂网视频在线观看 | 国产a国产a国产a | 日韩一区二区三区在线观看 | 91一区二区三区久久久久国产乱 | 999久久久久久久久 69av视频在线观看 | 久久久.com | 国产精品18久久久久vr手机版特色 | 天天操天天干天天插 | 国产欧美在线一区二区三区 | 久久国产一区二区三区 | 国产精品视屏 | 国产精品一区二区在线 | 在线观看av小说 | 人人爱人人射 | 美女国产免费 | 日韩欧美一区二区三区在线 | 免费视频区 | 日日操夜| 九九综合九九综合 | 综合五月 | 日韩三级视频 | 久久久久免费视频 | 欧美精品二 | 国产成人福利在线 | 国产精品欧美日韩在线观看 | 精品国产精品久久一区免费式 | 中文字幕一二 | 九九九免费视频 | 国产成人av电影在线观看 | 亚洲最新毛片 | 久久1电影院| 国产午夜三级一区二区三 | 久久精品久久99 | 成人资源在线播放 | 久久精品爱爱视频 | 一区二区三区四区在线 | 四月婷婷在线观看 | 99精品欧美一区二区蜜桃免费 | 久久精品久久久久 | 国产黄a三级 | 国产一区二区综合 | 91亚洲精品久久久蜜桃借种 | 一区二区三区久久精品 | 五月天婷亚洲天综合网鲁鲁鲁 | 九色视频网 | 免费看三级黄色片 | 久久久久久毛片 | 亚洲九九九在线观看 | 中文字幕在线观看的网站 | 亚洲一区二区视频在线 | 国产福利午夜 | 国产四虎影院 | 亚洲精品乱码白浆高清久久久久久 | 97超碰国产精品女人人人爽 | 日韩中文字幕在线观看 | 国产精品久久久久一区二区三区共 | 欧美日韩国产综合一区二区 | 在线观看亚洲国产精品 | 亚洲高清视频一区二区三区 | 日韩天天干 | 国产欧美日韩视频 | 国产精品亚洲片夜色在线 | 成年人三级网站 | 97成人在线视频 | 亚洲女欲精品久久久久久久18 | 久久a热6| 五月综合网站 | 久久免费精品 | 久久综合九色综合欧美就去吻 | 久久视频精品 | 国产精品亚州 | 色99导航| 国产福利网站 | 中文字幕亚洲不卡 | 成年人在线观看网站 | 97av影院| 亚洲精品男女 | 人人爽人人爽人人爽学生一级 | 日韩欧美在线观看一区 | 99精品在这里 | 午夜精品福利在线 | 91精品国产一区二区在线观看 | 国产亚洲精品成人av久久ww | 天天操网站 | 麻豆一区在线观看 | wwwwwww色| 黄污视频网站 | 91精品国产高清自在线观看 | 天天色棕合合合合合合 | 午夜精品久久久 | 伊人五月天 | 有码中文字幕在线观看 | 99热最新在线 | 超碰国产在线播放 | 狠狠色丁香久久婷婷综合丁香 | 日日天天 | 婷婷综合导航 | 国产91精品看黄网站 | 日韩一区二区三区视频在线 | 国产高清黄| 99久久婷婷 | 在线观看网站黄 | 亚洲在线视频网站 | 欧美性生活小视频 | 精品在线观看一区二区 | 6080yy午夜一二三区久久 | 91视频啊啊啊 | freejavvideo日本免费 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 亚洲日本黄色 | 天天摸夜夜操 | 五月天久久久久 | 天天人人 | 亚洲老妇xxxxxx | 国产理论一区二区三区 | 四虎国产永久在线精品 | 黄色网址a | 国产精品久久片 | 国产精品白丝av | 九九九九热精品免费视频点播观看 | 久久成人资源 | 欧美色综合天天久久综合精品 | 99热在线观看免费 | 色噜噜噜噜 | 91亚洲精品在线 | 又黄又网站 | 日韩一区二区三区高清在线观看 | 超碰av在线播放 | 男女全黄一级一级高潮免费看 | 69国产盗摄一区二区三区五区 | 中文字幕在线视频一区 | 亚洲成熟女人毛片在线 | 成人av电影在线观看 | 亚洲乱码国产乱码精品天美传媒 | 中文字幕在线看视频 | 国产一区不卡在线 | 中文字幕在线观看资源 | 日韩精品免费在线播放 | 久久伊人精品一区二区三区 | 欧美日韩高清一区二区 | 人人干干人人 | 国产精品久久久久久久婷婷 | 又长又大又黑又粗欧美 | 一区二区三区四区免费视频 | 日日操网 | 麻豆国产视频下载 | 日韩精品不卡在线观看 | 在线看片视频 | 西西大胆啪啪 | 国产精品不卡一区 | www.色就是色| 日韩欧美xxxx | 久久久久久久久久久免费 | 99爱这里只有精品 | 日韩欧美在线免费 | 欧美一级特黄aaaaaa大片在线观看 | 人人爱爱人人 | 日日夜夜精品视频 | 午夜精品久久久久久久99水蜜桃 | 激情电影影院 | 婷色在线| se视频网址 | 在线观看免费色 | 在线看岛国av | 人人操日日干 | 五月婷婷六月丁香在线观看 | www黄免费 | 中文字幕亚洲综合久久五月天色无吗'' | 久久ww| 国产精品大片 | 粉嫩av一区二区三区四区五区 | 亚洲综合在线发布 | 91黄色在线观看 | 久久久久久久免费 | 亚洲人成在线观看 | 亚洲精品国产精品国产 | 欧美 另类 交| 成人一区二区在线 | 久久99中文字幕 | 欧美日高清视频 | 国产区精品区 | 99在线观看视频网站 | 伊人中文字幕在线 | 日韩免费高清 | 日韩精品一区二区三区在线视频 | 欧美国产视频在线 | 国产在线观看91 | 天天做天天爱夜夜爽 | 日韩国产精品久久 | 日韩欧美在线影院 | 91精品视频导航 | 国产精品不卡在线 | 国产精品手机视频 | av丝袜制服 | 久久免费av电影 | 久久精品视频观看 | 91精品国产99久久久久久久 | 欧美久久久久久久久久久 | 天堂资源在线观看视频 | 天堂av在线网站 | www.婷婷色 | 中文在线√天堂 | bbbbb女女女女女bbbbb国产 | 色在线最新 | 免费视频久久久久 | 国产一卡久久电影永久 | 久久精品久久精品久久 | 青草草在线视频 | 手机看片久久 | 天无日天天操天天干 | 99久久久国产精品免费99 | 色婷婷国产在线 | 视频在线观看91 | av福利在线看 | 国产精品久久久精品 | 亚洲精品乱码久久久久久按摩 | 激情久久网 | 蜜桃视频色 | 久久高清视频免费 | 国产探花视频在线播放 | 久久免费视频8 | 毛片网站在线看 | 少妇啪啪av入口 | 亚洲视频免费在线观看 | 91亚洲视频在线观看 | 亚洲黄色av | 91在线操 | 亚洲黄色免费观看 | 蜜桃视频在线观看一区 | 1000部18岁以下禁看视频 | 黄色a视频 | 91手机电视 | 久久黄色影院 | 免费看十八岁美女 | 97在线视 | 中文字幕精品一区 | 国产一区二区三区黄 | 91亚洲精品在线 | www.黄色片网站 | 国产一在线精品一区在线观看 | 欧美日韩久久 | 久久久黄色 | 亚洲国产精品久久久久久 | 美女很黄免费网站 | 亚洲一区二区视频 | 国产视频一区二区在线播放 | www.狠狠色 | 国产粉嫩在线 | 国产中文字幕在线播放 | 久久精品免费观看 | 成人动图| www一起操 | 亚洲国产成人精品电影在线观看 | 日日夜夜综合网 | 久久影院午夜论 | 国产精品一级在线 | 国产一区在线视频 | 手机在线观看国产精品 | 欧美一级特黄aaaaaa大片在线观看 | 91精品久久久久久久99蜜桃 | 中文字幕国产精品一区二区 | 中文字幕一区二区在线播放 | 免费三级黄色片 | 色久av| 亚洲黄污| 国产精品99久久免费黑人 | 激情网五月婷婷 | 欧美日韩国产一区二区三区在线观看 | 夜夜爽88888免费视频4848 | 操操操天天操 | 97精品国自产拍在线观看 | 777视频在线观看 | av日韩国产 | 91日韩在线| 欧美日韩亚洲第一页 | 久草在线视频资源 | 欧美日韩在线观看一区二区 | 成人在线播放视频 | 久久亚洲二区 | 久久国产乱 | 久久免费视频99 | 国产成人一二三 | 国产日韩中文字幕 | 国产探花 | av在线播放一区二区三区 | 精品国产电影一区二区 | 亚洲精品视频二区 | 久草视频99| 日本不卡久久 | 波多野结衣电影一区二区 | 麻豆久久久久久久 | 精品国产伦一区二区三区观看体验 | 中文字幕亚洲在线观看 | 中文字幕在线视频一区 | 国产福利91精品 | 日本bbbb摸bbbb| 亚洲日本激情 | 免费久久久久久久 | 精品国产一区二区三区四区在线观看 | 国内综合精品午夜久久资源 | 欧美色图一区 | 亚洲视频 视频在线 | 人人射人人爱 | 9999精品视频 | 美女视频免费精品 | 亚洲免费观看在线视频 | 亚洲精品xx | 国产精品久久久亚洲 | 成人三级网站在线观看 | 91九色九色 | 日韩欧美高清一区二区 | 欧美精品一区在线 | 国产成人精品一区二区三区网站观看 | 少妇搡bbbb搡bbb搡忠贞 | 一区二区三区在线免费播放 | 精品中文字幕在线观看 | 四虎国产精品免费 | 99精品国产99久久久久久97 | www.狠狠色.com| 欧美极度另类 | 国产在线观看av | 天天草天天干天天射 | 97在线观看免费观看 | 午夜在线日韩 | 欧美精品乱码99久久影院 | 免费在线观看黄网站 | 国产精品久久久久久婷婷天堂 | 丁香婷五月| 在线免费观看一区二区三区 | 区一区二区三区中文字幕 | 麻豆久久久久 | 久久九九影视网 | 日韩欧美高清一区二区三区 | 日本成址在线观看 | 成人午夜精品福利免费 | 婷婷电影在线观看 | 久久a级片 | 国产美女免费看 | 亚洲国产精品成人精品 | 91传媒在线观看 | 欧美91片| 91在线成人| 日日爽天天爽 | 久草网在线视频 | 午夜国产在线观看 | 黄污网站在线观看 | 婷婷精品| 中文字幕二区在线观看 | 最近日本mv字幕免费观看 | 在线日韩中文 | 日日操夜| 精品国产一区二 | av在线播放亚洲 | 人人爱爱人人 | 成人黄色毛片 | 97精品国产97久久久久久免费 | 91丨九色丨国产在线 | 精品福利视频在线 | 99综合电影在线视频 | 免费久久久久久 | www.夜夜草| 久久免费看毛片 | 爱爱一区 | 黄色视屏在线免费观看 | 日韩av影视在线观看 |