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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ Oracle OCCI 编程

發布時間:2024/7/23 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ Oracle OCCI 编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:http://blog.csdn.net/gumingyaotangwei/article/details/7337893


OCCI數據庫Oracle編程步驟
1.?配置環境
(1)?Occi訪問數據庫需要occi.h頭文件,此文件在oracle安裝目錄下,必須有oracle庫的支持。安裝oracle服務端或客戶端;
(2)?配置NLS_LANG環境變量,必須與數據庫的字符編碼一致,否則可能出現中文亂碼;
(3)?配置環境變量,使客戶端支持中文顯示;
(4)?安裝C++編程工具和g++編譯工具。
2.?編寫C++程序
(1)?Environment類創建occi環境變量;
(2)?Environment類下的createConnection方法創建連接數據庫的Connection對象;
(3)?Statement類創建對象,由數據庫連接對象調用createStatement方法創建;
(4)?Statement類創建對象調用setSQL()準備SQL語句;
(5)?Statement類創建對象調用execute()或executeUpdate()或executeQurey()或executeArrayUpdate()方法執行查詢,如果是查詢的,創建ResultSet對象接收數據集;如果是數據更新回插入:Statement:: setAutoCommit (TRUE); 設置自動提交;Statement::setAutoCommit(FALSE); 設置手動提交,手動提交:Connection::commit();Connection::rollback();
(6)?Statement類創建對象調用getxxx()方法獲取字段數據;
(7)?terminateStatement()終止Statement對象;
(8)?terminateConnection()斷開數據庫連接;
(9)?Environment::terminateEnvironment()終止環境變量。

#include <iostream> #include <occi.h>//occi頭文件 //聲明命名空間 using namespace oracle::occi; using namespace std;int main () {Environment *env; Connection *conn; Statement *stmt;ResultSet *rs;string username = "system";//用戶名string password = "st1234";//密碼string connstring = "orcl";//數據庫連接字符串string sql,strname;int isno;env = Environment::createEnvironment();//創建環境變量conn = env->createConnection(username,password,connstring); //創建數據庫連接對象stmt = conn->createStatement();//創Statement對象sql = " SELECT u_id,u_name,to_char(u_date,'yyyy-mm-dd hh24:mi:ss') FROM student";stmt->setSQL(sql);//準備SQL語句try{rs = stmt->executeQuery();//執行SQL語句,返回結果集while (rs->next()) //取數據{isno = rs->getInt(1);strname=rs->getString(2); cout<< isno << " AND " << strname << endl;cout<<rs->getString(3)<<endl;}cout <<"SELECT SUCCESS" << endl;} catch(SQLException ex) //異常處理{cout << " Error Number "<< ex.getErrorCode() << endl;cout << ex.getMessage() << endl;}conn->terminateStatement(stmt);//終止Statement對象env->terminateConnection(conn);//斷開數據庫連接Environment::terminateEnvironment(env);// 終止環境變量return 1; }

3.?編寫makefile文件
Makefile:
includepath=${ORACLE_HOME}/rdbms/public
libpath=${ORACLE_HOME}/lib
libfile=-L ${libpath} -locci -lclntsh /usr/lib/libstdc++.so.5
incfile=-I ${includepath}

occiselect:select.cpp
??????? g++ -o occiselect select.cpp? ${libfile} ${incfile}
clean:
??????? rm occiselect
4.?編譯程序
Make occiselect.


1.??OCCI編程模式

1.1. 總體流程圖

編寫OCCI程序的總體流程圖,如下所示:

?

1.2. 執行SQL語句的流程圖

在OCCI中處理SELECT語句跟處理INSERT、UPDATE、CREATE等語句的方法是不一樣的,其中SELECT語句是有返回結果,其它語句沒有返回結果,所以必須區分SQL語句是否為查詢語句,然后按照各自的流程處理。流程圖如下所示:

注:標*號的過程為可選項

?

2.??流程圖具體說明

2.1. 創建與終止OCCI環境變量

???????????????????????創建OCCI環境變量

Environment類是OCCI程序的基礎類,所有的OCCI對象的建立都是依計Environment對象來創建的,所以Environment對象的建立必須放在第一位,而且也必須是最后一個被終止的。例如:首先創建一個Environment對象env,然后通過env創建一個Connection對象conn,conn是連接了數據庫的對象;終止時,卻反過來先終止對象conn,再終止對象env。具體Environment對象的創建方法如下所示:

?

Environment *env = Environment::createEnvironment();

?

注意:createEnvironment()方法有以下幾個參數模式:

1.?在線程環境中運行分為互斥線程(THREADEC_MUTEXED)、并行線程(THREADEC_UMMUTEXED)。

2.?使用對象(OBJECT)。

3.?利用共享數據結構(SHARED)。

???????????????????????終止OCCI環境變量

Environment對象的終止必須是放在最后一位,即等所有其它OCCI對象被終止完后再終止Environment對象。終止Environment對象的方法如下所示:

?

Environment::terminateEnvironment(env);

2.2. 連接與斷開數據庫

???????????????????????連接數據庫

創建完一個Environment對象env后,可以調用Environment類下的方法createConnection()來創建一個Connection對象conn;通過createConnection()方法我們可以連接到任意一個數據庫中。連接數據庫的具體方法如下所示:

?

Connection *conn = env->createConnection(usename,password,[connectionstring]);

?

參數說明:usename是登錄數據庫的用戶名;

????????????? ? password是登錄數據庫用戶的密碼;

????????????? ? connectstingr是數據庫的連接串(可選)。

???????????????????????斷開數據庫

當對數據庫操作完成之后,我們必須斷開程序與數據庫的連接,斷開數據庫的連接方法與創建的方法一樣來自Environment類下的terminateConnection()函數。方法如下所示:

?

env->terminateConnection(conn);

2.3. 創建與斷開連接池

???????????????????????創建連接池

對于很多共享服務器或中間層應用程序而言,數據庫的連接必須要能被許多線程所使用,如果為每個線程都開一個數據庫連接的話,當數量一大效率會明顯的降低,所以我們通過創建連接池來處理這樣的情況。創建完一個Environment對象env后,可以調用Environment類下的方法createConnectionPool()來創建一個Connection對象connPool;通過createConnectionPool()方法我們可以連接到任意一個數據庫中。連接池創建的具體方法如下所示:

?

ConnectionPool ?*connPool= env->createConnectionPool(

const? string?&poolUseName,

const? string?&poolPassWord,

const? string?&connectstring,

unsigned? int?? minConn,

unsigned? int?? maxConn,

unsigned? int?? incrConn);

?

參數說明:poolUseName是連接池的用戶名;

????????????? ? poolPassWord是連接數據庫的密碼;

????????????? ? connectstring是數據庫連接串;

????????????? ? minConn是最小連接數;

????????????? ? maxConn是最大連接數;

incrConn是指所有已連接數處于繁忙中且小于最大連接數時,每次增加的連接數。

???????????????????????斷開連接池

當對數據庫操作完成之后,我們必須斷開程序與數據庫的連接,斷開數據庫的連接方法與創建的方法一樣來自Environment類下的terminateConnectPool()函數。方法如下所示:

?

env->terminateConnectPool(connPoll);

2.4. 創建與終止Statement對象

2.4.1.??? 創建Statement對象

Statement類包含了執行SQL語句的所有方法,是對數據庫操作的具體實現。Statement對象stmt的創建是通過調用Connection類下的createStatement()函數實現,所以Statement對象的創建必須是在Connection對象創建之后。createStatement()函數可以帶參數或不帶參數,如果帶參數的話,參數必須是一個SQL語句;如果沒有帶參數,則在后面必須用Statement類下setSQL()函數為Statement對象賦一個SQL語句。Statement對象的創建方法如下所示:

?

Statement?*stmt = conn->createStatement();

???????????????????????終止Statement對象

當對數據庫的操作完成時,我們必須先終止Statement對象,再斷開Connection對象。終止Statement對象的方法如下所示:

?

Conn->terminateStatement(stmt);

3.??執行SQL語句(Statement類)

3.1. 執行SQL語句的方法

執行SQL的所有方法都包含在Statement類下。SQL語句按返回結果分,可以分為兩種:一種是有返回值的(查詢語句),另外一種是沒有返回值的(非查詢語句)。一般情況下,在執行查詢SQL語句我們使用executeQurey()函數,在執行非查詢SQL語句時我們使用executeUpdate()函數。

?

1.?stmt->execute();執行所有非特殊聲明的SQL語句。

2.?stmt->executeUpdate();執行所有DDL和DML(一條記錄)的SQL語句。

3.?stmt->executeQurey();執行所有查詢SQL語句。

4.?stmt->executeArrayUpdate();執行多記錄的DML的SQL語句。

例如:

?????? stmt->executeUpdate(“createtable student (sno number(10),sname varchar2)”);

?????? stmt->executeUpdate(“insertinto student (sno,sname)? values(1,’ZHANGSAN’)”);

?????? stmt->executeQurey(“select? sno?from student ”);

3.2. 執行非查詢語句

當我們創建了一個Statement對象stmt后,可以通過Statement類下的方法setSQL()為stmt設置不同的SQL語句。

?

3.2.1.???準備SQL語句

stmt->setSQL(string &sql);

例如:

stmt->setSQL(“insertinto student (sno,sname)? values(:1,:2)”)

其中::1、:2是參數,通過給參數賦不同的值來實現。

?

與之對應的函數getSQL()是取出當前對象對應的SQL語句。

?

3.2.2.???綁定輸入參數值

在Statement類中包含了所有參數的賦值方法,賦值方法set×××(unsignedint paramindex,type values),其中paramindex參數是代表所賦值參數在SQL語句中的第幾個參數,×××與type代表中所賦值的類型,values是所賦的值。×××可以是Int、String、Date等等。

例如:

stmt->setString(1,’zhangsan’);指把’zhangsan’賦值給第一個參數,參數類型為字符串型。

stmt->setInt(2,1009);指把1009賦值給第二個參數,參數類型為整型。

?

3.2.3.???執行非查詢語句

當SQL語句準備好后,就可以執行SQL語句了,方法如下所示:

?

stmt->executeUpdate();

?

3.3. 執行查詢語句(SELECT)

在執行查詢語句時有返回查詢結果(可能是一條,也可能是多條),我們必須創建一個ResultSet對象來處理,通過使用ResultSet對象的next()方法我們可以一條一條(或批量)地處理結果集。具體使用如下所示:

?

?

3.3.1.???準備SQL語句

詳見3.2.1。

?

3.3.2.???綁定輸入參數值

詳見3.2.2。

?

3.3.3.???執行查詢語句

?

ResultSet?*rs = stmt->executeQuery();

3.3.4.???定義輸出變量

?????? 根據SELECT語句查詢的列的類型定義對應的變量,此變量用于存儲SELECT查詢的結果集。

3.3.5.???推進或處理數據

如果結果集為多條記錄,我們可以批量或者一條條處理數據,使用ResultSet類下的方法next(unsigned int numRows)。

在Statement類中包含了所有參數的取值方法。取值方法get×××(unsignedint paramindex),其中paramindex參數是代表所取值列在SQL語句中的第幾列,×××代表該列對應的類型。×××可以是Int、String、Date等等。

例如:

rs->next(unsignedint numRows);//其中numRows為批量處理的記錄行數。

?

stmt->getInt(paramindex);獲取整型參數值,其中paramindex為參數所在的位置;

stmt->getString(paramindex);獲取字符型參數值其中paramindex為參數所在的位置;

3.4. 輸出參數聲明

在調用存儲過程時,有時候有返回參數,這些返回參數都必須在調用之前先用Statement類下的registerOutParam()方法聲明,聲明方法的使用如下所示:

stmt->registerOutParam(paramName,paramType,paramSize);

其中:paramName是參數名或者參數所在位置;

?????? ? paramType是參數類型(比如:TYPE::OCCIINT);

?????? ? paramSize是參數的大小。

?

3.5. 事務提交

3.5.1.???手動提交

當事務的提交設置為手動時,每完成一個事務我們都必須調用Connection類下的commit()或rollback()方法來提交一個事務。使用方法如下所示:

?

手動提交必須調用以下函數:

Connection::commit();

Connection::rollback();

3.5.2.???自動提交

在對數據庫進行操作的過程中,一個事務的提交是用手動還是自動,我們可以調用Statement類下的setAutoCommit()方法來設置。使用方法如下所示:

?

設置自動提交:

Statement:: setAutoCommit (TRUE);

設置手動提交:

Statement::setAutoCommit(FALSE);

?

4.??OCCI常用類簡要介紹

4.1. Environment類

Environment類提供了管理OCCI對象的內存及其它資源的一個環境,包含以下方法:

1.?createConnection(const stringusename,const string password,const string connstring);指與數據庫建立一個連接。

2.?createConnectionPoll(

const? string?&poolUseName,

const? string?&poolPassWord,

const? string?&connectstring,

unsigned? int? ?minConn,

unsigned? int??maxConn,

unsigned? int??incrConn);? 創建連接池。

參數說明:poolUseName是連接池的用戶名;

????????????? ? ??? ??poolPassWord是連接數據庫的密碼;

????????????? ????? connectstring是數據庫連接串;

????????????? ????? minConn是最小連接數;

????????????? ????? maxConn是最大連接數;

incrConn是指所有已連接數處于繁忙中且小于最大連接數時,每次增加的連接數。

3.?createEnironment(Mode? mode );創建一個環境對象,其中mode是模式(可選DEFAULT、THREADED_MUTEXED、THREADED_UN-MUTEXED、OBJECT、SHARED值)。

4.?getCurrentHeapSize();指在同一環境下已經分配的內存數。

5.?getOCIEnironment();返回一個OCI環境指針。

6.?terminateConnection(Connection*conn);斷開與數據庫的連接。

7.?terminateConnection(ConnectionPool*poolconn);斷開與數據庫的連接池。

8.?terminateEnironment(Einironment? *env);終止OCCI環境變量。

4.2. Connection類

Connection類提供了C++程序與指定數據庫的連接,包含以下方法:

1.?changePassword(const string&user,const string &oldPassword,const string &newPassword);改變當前用戶的密碼。

2.?Commit();提交事務。

3.?createStatement(const string&sql=””);創建一個Statement對象。

4.?flushCache();

5.?rollback();事務的回滾。

6.?terminateStatement(Statement*stmt).終止一個Statement對象,并釋放它占有的所有資源。

4.3. ConnectionPool類

ConnectionPoll類提供了C++程序與指定數據庫間的連接池,包含以下方法:

1.?createConnection(const string&username,const string &password);創建一個連接。

2.?getBusyConnections();返回連接池中被占用的連接數量。

3.?getMaxConnections();返回連接池的最大連接數。

4.?getMinConnections();返回連接池的最小連接數。

5.?getOpenConnections();返回連接池中已經被打開的連接數。

6.?getPollName();返回連接池的名稱。

7.?getTimeOut();返回連接池的超時時間。

8.?setErrorOnBusy();設置異常,當連接池處于繁忙或達到最大連接數后。

9.?serPoolSize(unsigned intminConn,unsigned int maxConn,unsigned int incrConn);設置連接池的大小,其中參數minConn是最小連接數,maxConn是最大連接數,incrConn是遞增連接數。

10.?????????????setTimeOut();設置超時時間。

11.?????????????terminateConnection(Connection? *conn);斷開連接。

4.4. Statement類

Statement對象主要被用來執行SQL語句,它可以運行一個查詢語句返回一個結果集也可以運行UPDATE、DELETE等SQL語句。

1.?addIteration();增加一個循環。

2.?closeResultSet(ResultSet *rs);關閉一個結果集。

3.?closeStream(Stream? *stream);關閉一個已定義的流。

4.?execute(const string &sql =“”);執行一個SQL語句,如果前面使用的setSQL()方法,則參數sql可以為空。

5.?executeArrayUpdate(unsigned intarrayLength);同時修改多條記錄,前面必須使用了setDataBuffer()方法設置一個數量或設置了一個流(stream)。

6.?executeQuery();執行一個查詢語句。

7.?executeUpdate();執行DDL、DML語句,如:INSERT、UPDATE、DELETE、CREATE等等。

8.?getAutoCommit();返回是否事務自動提交。

9.?getDate(unsigned int paramindex);返回DATE型數據。

10.?????????????getDouble(unsigned intparamindex);返回DOUBLE型數據。

11.?????????????getFloat(unsigned int paramindex);返回FLOAT型數據。

12.?????????????getInt(unsigned intparamindex);返回INT型數據。

13.?????????????getNumber(unsigned intparamindex);返回NUMBER型數據。

14.?????????????getRef(unsigned intparamindex);返回REF參數值。

15.?????????????getResultSet();得到一個結果集(ResultSet)。

16.?????????????getSQL();返回當前的SQL語句。

17.?????????????getString(unsigned intparamindex);返回STRING型數據。

18.?????????????getUpdateCount();返回被更新的數量。

19.?????????????isNull(unsigned intparamindex);判斷第X個值是否為空。

20.?????????????isTruncated(unsigned intparamindex);判斷第X個值是否被截取。

21.?????????????setAutoCommit(bool autocommit);設置事務是否自動提交。

22.?????????????setDouble(unsigned intparamindex,double x);賦一個double型的值。

23.?????????????setFloat(unsigned intparamindex,float x);賦一個float型的值。

24.?????????????setInt(unsigned intparamindex,int x);賦一個INT型的值。

25.?????????????setNull(unsigned intparamindex,TYPE type);某參數設置為空。

26.?????????????setNumber(unsigned intparamindex,const number &x);賦一個Number型的值。

27.?????????????setObject(unsigned intparamindex,PObject *x);賦一個PObject型的值。

28.?????????????setString(unsigned intparamindex,const string &x);賦一個string型的值。

29.?????????????setSQL(const string &sql);設置一個SQL語句。

30.?????????????Status();返回當前的狀態。

4.5. ResultSet類

ResultSet類是查詢數據表的結果集,它包含以下方法:

1.?cancel();取消結果集。

2.?closeStream(Stream? *stream);關閉一個流。

3.?getDouble(unsigned intcolIndex);返回double型的值。

4.?getFloat(unsigned intcolIndex);返回float型的值。

5.?getInt(unsigned int colIndex);返回int型的值。

6.?getMaxColumnSize(unsigned intcolIndex);返回某列包含的數據量。

7.?getNumber(unsigned intcolIndex);返回number型的數據。

8.?getPObject(unsigned intcolIndex);返回PObject型的數據。

9.?getRowid(unsigned intcolIndex);返回rowid值。

10.?????????????getString(unsigned intcolIndex);返回string型的數據。

11.?????????????isNull(unsigned int colIndex);判斷值是否為空。

12.?????????????isTruncated(unsigned intcolIndex);判斷值是否被刪。

13.?????????????next(unsigned int numRows);取下numRows條記錄。

14.?????????????status();返回當前狀態。

4.6. PObject類

PObject類包含以下方法:

1.?fush();

2.?Connection *getConnection();從一個實例化的永久對象中返回連接。

3.?isLocked();判斷永久對象是否被鎖(TRUE或FALSE)。

4.?isNull();判斷永久對象是否為空(TRUE或FALSE)。

5.?Lock(PObject::LockOption? lock_option);在數據庫中鎖住一個對象,其中lock_option取值為OCCI_LOCK_WAIT、OCCI_LOCK_NOWAIT。

6.?markDelete();刪除數據庫中的永久對象。

7.?markModified();修改永久對象。

8.?PObject &operator(constPObject &obj);賦值(對象)。

9.?operator delete(void*obj,size_t size);刪除對象,但不能刪除數據庫中的對象。

10.?????????????*operator new(size_t size);創建臨時對象。

11.?????????????*operator new(size_t size,constConnection *x,const string &tablename,const char *type_name);創建永久對象。

12.?????????????pin();

13.?????????????setNull();設置對象為空。

14.?????????????unmark();不標記永久對象為刪除或修改。

15.?????????????unpin(UnpinOption mode);其中,mode的取值為OCCI_PINCOUNT_RESET、OCCI_PINCOUNT_DECR。

4.7. SQLException類

SQLException類提供錯誤代碼及其錯誤信息,包含以下方法:

1.?getErrorCode();返回數據庫中的錯誤編碼。

2.?getMessage();返回錯誤信息,沒有則為空。

4.8. Date類

Date類包含以下方法:

1、?addDays(int i);返回增加i天后的日期。

2、?addMonths(int i);返回增加i個月后的日期。

3、?intervalDS daysBetween(constDate &d);返回與d相差的天數。

4、?getDate(int &year,unsignedint &month,unsigned int &day,unsigned int &hour,unsigned int&minute,unsigned int &second );返回分年月日小時分秒格式。

5、?getSystemDate(const Environment*env);返回系統日期。

6、?isNull();判斷是否為空;

7、?lastDay();返回當月的最后一天日期。

8、?setDate(int&year=1,unsigned int &month=1,unsigned int &day=1,unsigned int&hour=0,unsigned int &minute=0,unsigned int &second=0);設置日期值。

9、?setNull();設置為空。

4.9. Number類

Number類包含以下常用方法:

1、?abs();返回絕對值。

2、?floor();向下取整。

3、?isNull();判斷是否為空。

4、?operator+(const Number&a,const Number &b);兩數相加。

5、?operator-( const Number&a,const Number &b);兩數相減(a-b)。

6、?operator*(const Number&a,const Number &b);兩數相乘。

7、?operator/(const Number&a,const Number &b);兩數相除。

8、?operator%(const Number&a,const Number &b);求余。

9、?operator<(const Number&a,const Number &b);a是否小于b。

10、?????????????operator<=(const Number&a,const Number &b);a是否小于等于b。

11、?????????????operator>(const Number&a,const Number &b);a是否大于b。

12、?????????????operator>=(const Number&a,const Number &b);a是否大于等于b。

13、?????????????operator==(const Number&a,const Number &b);a與b是否相等。

14、?????????????operator!=(const Number&a,const Number &b);判斷a是否不等于b。

15、?????????????operator char();將number型轉化為char型。

16、?????????????operator signed char();將number型轉化為有符號char型。

17、?????????????operator double();將number型轉化為double型。

18、?????????????operator float();將number型轉化為float型。

19、?????????????operator int();將number型轉化為int型。

20、?????????????operator long();將number型轉化為long型。

21、?????????????operator short();將number型轉化為short int型。

22、?????????????setNull();設置為空。

23、?????????????trunk();取整。

5.??附錄:代碼示例

5.1. 查詢流程處理示例

下面給出了一個查詢的例子qrystudent.cpp,通過使用OCCI接口函數查詢數據庫表student的信息(學號,學生姓名)。

?

#include <iostream>

#include <occi.h>

?

using namespace oracle::occi;

using namespace std;

?

int main ()

{

Environment *env;

Connection *conn;

Statement *stmt;

ResultSet *rs;

?

string username = “ipd”;

string password = “ipd”;

string connstring = “ora9i”;

string sql,strname;

int isno;

?

env = Environment::createEnvironment(); //創建一個環境變量

conn = env->createConnection(username,password,connstring);//創建一個數據庫連接對象

stmt = conn->createStatement(); //創建一個Statement對象

?

sql = “ SELECT sno,sname FROM student “;? //拼接一個SQL語句

stmt->setSQL(sql); //設置SQL語句到Statement對象中

try {

?????? rs=? stmt->executeQuery();//執行SQL語句

?????? while(rs->next()) { //用循環,一條一條地取得查詢的結果記錄

????????????? isno= rs->getInt(1);//取出第一列的值(對應為int型)

????????????? strname=rs->getString(2);//取出第二列的值(對應為string型)

????????????? cout<< isno << “? AND? “ << strname << endl;

?????? }

?????? cout<< “SELECT ―― SUCCESS”<< endl;

} catch (SQLException ex) {

?????? cout<< “ Error Number : “<< ex.getErrorCode() << endl; //取出異常代碼

?????? cout<< ex.getMessage() << endl; //取出異常信息

}

?

conn->terminateStatement(stmt); //終止Statement對象

env->terminateConnection(conn); //斷開數據庫連接

Environment::terminateEnvironment(env); //終止環境變量

?

return 1;

}

5.2. 非查詢流程處理示例

下面給出了一個insert例子inserttab.cpp,通過使用OCCI接口函數往數據庫表student中插入信息(學號,學生姓名)。

?

#include <iostream>

#include <occi.h>

?

using namespace oracle::occi;

using namespace std;

?

int main ()

{

Environment *env;

Connection *conn;

Statement *stmt;

?

string username = “ipd”;

string password = “ipd”;

string connstring = “ora9i”;

string sql;

?

env = Environment::createEnvironment(); //創建一個環境變量

conn =env->createConnection(username,password,connstring); //創建一個數據庫連接對象

stmt = conn->createStatement(); //創建一個Statement對象

?

sql = “ INSERT INTO student(sno,sname)? VALUES ( :x,:y) “; //拼接SQL語句

stmt->setSQL(sql); //設置SQL語句到Statement對象中

try {

?????? stmt->setInt(1,10001);//給第一個參數x賦值

?????? stmt->setString(2,”zhangsan”);//給第二個參數y賦值

?????? stmt->executeUpdate();//執行SQL語句

?????? cout<< “INSERT ―― SUCCESS”<< endl;

} catch (SQLException ex) {

?????? cout<< “ Error Number : “<< ex.getErrorCode() << endl; //獲得異常代碼

?????? cout<< ex.getMessage() << endl; //獲得異常信息

}

?

conn->terminateStatement(stmt); //終止Statement對象

env->terminateConnection(conn); //斷開數據庫連接

Environment::terminateEnvironment(env); //終止環境變量

?

return 1;

}

5.3. 批量處理非查詢語句

在批量處理非查詢語句時,首先必須使用m_stmt->setMaxIterations(unsigned int maxnum)方法設置最大的批處理數;然后使用setMaxParamSize(unsignedint paramindex,int paramsize)方法設置對應參數的大小,對于有固定長度的參數可以不必重新設置,如int,double;最后循環綁定參數使用set×××()方法,每循環一次必須使用addIteration()方法再進行下一次循環,直到最后一次。例子如下所示:

#include <iostream>

#include <occi.h>

?

using namespace oracle::occi;

using namespace std;

?

int main ()

{

???Environment *env;

???Connection *conn;

???Statement *stmt;

???

???string username = "bill";

???string password = "bill";

???string connstring = "jftest";

???string sql;

?

intisno[2]={21,22},i,iage[2]={18,19};

stringcsname[2]={"namea","nameb"};

?

???try {

???????env = Environment::createEnvironment();

???????conn = env->createConnection(username,password,connstring);

???????stmt = conn->createStatement();

???????stmt->setAutoCommit(false);

???????

???????sql = " INSERT INTO student (sno,sname,age)? VALUES (:x,:y,:z) ";

???????

???????m_stmt->setSQL(sql);

???????m_stmt->setMaxIterations(2);

???????m_stmt->setMaxParamSize(1,sizeof(int));

???????m_stmt->setMaxParamSize(2,sizeof(string));

???????m_stmt->setMaxParamSize(3,sizeof(int));

???????cout<<"setMaxIterations success !"<<endl;

???????//cout<<"getMaxIterations = "<<m_stmt->getMaxIterations()<<endl;

???????for (i=0;i<2;i++)

???????{

???????????m_stmt->setInt(1,isno[i]);

???????????m_stmt->setString(2,csname[i]);

???????????m_stmt->setInt(3,iage[i]);

???????????

????????????//cout <<isno[i]<< " and " <<csname[i]<< " and " << iage[i] <<endl;

????

???????????if (i!=1) m_stmt->addIteration();

???????}

???????

???????cout<<"getMaxIterations ="<<m_stmt->getMaxIterations()<<endl;

??????

??? ?????? cout<<"setsuccess"<<endl;

??? ?????? inum = m_stmt->executeUpdate();

??? ?????? m_conn->commit();

??? ?????? cout << "INSERT ¨D¨DSUCCESS" << endl;

??? }catch (SQLException ex) {

??? ?????? inum = m_stmt->getUpdateCount();

??? ?????? cout << "ON" <<inum+1 << " shi fail !" << endl;

??? ?????? cout << " INSERT Error Number: "<< ex.getErrorCode() << endl;

??? ?????? cout << ex.getMessage() <<endl;

??? ?????? m_conn->rollback();

??? ?????? return 0;

??? }

???

???conn->terminateStatement(stmt);

???env->terminateConnection(conn);

???Environment::terminateEnvironment(env);

???

???cout << "PROGRAM IS END ." << endl;

???return 1;

}

5.4. 查詢語句中批量取數

在批量取數時,使用setDataBuffer()方法來設置接收數據緩沖區大小,例子如下所示:

#include <iostream>

#include <occi.h>

?

using namespace oracle::occi;

using namespace std;

?

int main ()

{

???Environment *env;

???Connection *conn;

???Statement *stmt;

???ResultSet *rs;

???

???string username = "bill";

???string password = "bill";

???string connstring = "jftest";

???string sql;

???int i,numrows=5,isnum,ilnum,ipos=0;

???int isno[5],vsno[20],ii=0,x[20];

???ub2 isnolen[5],snamelen[5];

???char sname[5][20],vsname[20][20];

???

??? for (i=0;i<20;i++)

??? {

???????isnolen[i]=sizeof(isno[i]);

snamelen[i]=strlen(sname[i]+1);

??? }

???

???cout << "PROGRAM START ..." << endl;

???

???try {

???????env = Environment::createEnvironment();

???????conn = env->createConnection(username,password,connstring);

???????stmt = conn->createStatement();

???????

???????sql = " SELECT sno,sname FROM student ";?

???????stmt->setSQL(sql);

???

??? ?????? rs =?stmt->executeQuery();

??? ??????

??? ?????? rs->setDataBuffer(1,isno,OCCIINT,sizeof(int));

??? ?????? rs->setDataBuffer(2,sname,OCCI_SQLT_STR,sizeof(sname[0]),snamelen);

??? ?????? ilnum = rs->getNumArrayRows();

??? ?????? cout << " ilnum = "<< ilnum <<endl;

??? ??????

??? ?????? while (rs->next(numrows)) {

??? ????????????? isnum = rs->getNumArrayRows();

??? ?????? ????cout << " isnum = "<< isnum <<endl;

??? ?????????????

??? ????????????? for(i=0;i<numrows;i++)

????????????? {

????????????? ????vsno[ipos] = isno[i];

????????????? ????vsname[ipos] = sname[i];

????????????? ????ipos = ipos+1;

????????????? }

??? ?????? }

???????ilnum = rs->getNumArrayRows();

??? ?????? cout << " ilnum = "<< ilnum <<endl;

??? ?????? for(i=0;i<ilnum-isnum;i++)

???????{

???????????vsno[ipos] = isno[i];

???????????vsname[ipos] = sname[i];

???????????ipos = ipos+1;

???????}

???????

???????cout << "SELECT RESULT IS ..." << endl;

???????for(i=0;i<ilnum;i++)

???????{

???????????cout<<vsno[i]<<" AND"<<vsname[i]<<endl;

???????}

???????cout << "SELECT RESULT END !" << endl;

??? ??????

??? ?????? cout << "SELECT ¨D¨DSUCCESS" << endl;

??? }catch (SQLException ex) {

??? ?????? cout << " Error Number :"<< ex.getErrorCode() << endl;

??? ?????? cout << ex.getMessage() <<endl;

??? }

???

???conn->terminateStatement(stmt);

???env->terminateConnection(conn);

???Environment::terminateEnvironment(env);

???

???cout << "PROGRAM END !" << endl;

???return 1;

}

5.5. MERGE語句的使用

在使用MEGER語句時,USING部分的取值應該使用表或者SELECT param1,param2FROM DUAL,其中param1,param2是常量值,可以通過數組賦值,并且每列值都應該取別名,在后面的使用中就只用別名。例子如下所示:

#include <iostream>

#include <occi.h>

?

using namespace oracle::occi;

using namespace std;

?

int main ()

{

???Environment *env;

???Connection *conn;

???Statement *stmt;

???

???string username = "bill";

???string password = "bill";

???string connstring = "jftest";

???string sql;

?

???int isno[2]={21,22},i,iage[2]={18,19};

?

???try {

???????env = Environment::createEnvironment();

???????conn = env->createConnection(username,password,connstring);

???????stmt = conn->createStatement();

???????stmt->setAutoCommit(false);

???????

???????sql = " merge into student a?";

???????sql += "??? using (select :xbid,:y bage from dual) b ";

???????sql += "??? on (a.sno =b.bid) ";

???????sql += "??? when matched then";

???????sql += "??? update set a.age=a.age+b.bage ";

???????sql += "??? when not matchedthen ";

???????sql += "??? insert(a.sno,a.age) ";

???????sql += "??? values(b.bid,b.bage) ";

???????

???????stmt->setSQL(sql);

???????stmt->setMaxIterations(2);

???????stmt->setMaxParamSize(1,sizeof(int));

???????//stmt->setMaxParamSize(2,sizeof(string));

???????cout<<"setMaxIterations success !"<<endl;

???????//cout<<"getMaxIterations = "<<stmt->getMaxIterations()<<endl;

???????for (i=0;i<2;i++)

???????{

???????????stmt->setInt(1,isno[i]);

???????????stmt->setInt(2,iage[i]);

????

???????????if (i!=1) stmt->addIteration();

???????}

???????

???????cout<<"getMaxParamSize = "<<stmt->getMaxParamSize(2)<<endl;??

???????cout<<"getMaxIterations ="<<stmt->getMaxIterations()<<endl;

?

??? ?????? cout<<"setsuccess"<<endl;

??? ?????? stmt->executeUpdate(); //?′DDSQLó???

??? ?????? conn->commit();

??? ?????? cout << "INSERT ¨D¨DSUCCESS" << endl;

??? }catch (SQLException ex) {

??? ?????? cout << " Error Number :"<< ex.getErrorCode() << endl;

??? ?????? cout << ex.getMessage() <<endl;

??? ?????? conn->rollback();

??? }

???

???conn->terminateStatement(stmt);

???env->terminateConnection(conn);

???Environment::terminateEnvironment(env);

???

???cout << "PROGRAM IS END ." << endl;

???return 1;

}


















總結

以上是生活随笔為你收集整理的c++ Oracle OCCI 编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美韩日在线 | 干天天 | 亚洲欧美视频在线观看 | 久久精品国产一区二区三区 | 黄色免费电影网站 | 日日日干 | 国产第页 | 国产精品一区二区果冻传媒 | 亚洲综合在线五月 | 国产精品99久久久久久久久 | 亚洲精品88欧美一区二区 | 96精品高清视频在线观看软件特色 | 91在线区| 国产精品黄色影片导航在线观看 | av中文字幕在线免费观看 | 久久免费在线视频 | 国产精品久久免费看 | 91在线观看欧美日韩 | 少妇性色午夜淫片aaaze | 日韩av有码在线 | 最新国产在线 | 91亚洲在线观看 | 日韩在线观看视频网站 | 三级a视频 | 免费在线观看av电影 | 麻豆传媒视频观看 | 久久一级片 | 国产成人精品一区二区三区免费 | 精品uu | 午夜久久久久久久久久久 | www.少妇| 少妇精69xxtheporn | 久久精品资源 | 久艹视频在线免费观看 | 久久免费精彩视频 | 国产福利午夜 | 日韩欧美精品一区 | 国产午夜免费视频 | 激情六月婷婷久久 | 在线只有精品 | 国产麻豆精品一区二区 | 天天色综合久久 | 中文字幕乱码电影 | 午夜av在线播放 | 国产免费小视频 | aaa日本高清在线播放免费观看 | 国产又粗又长又硬免费视频 | 久久亚洲福利视频 | 日韩免费看 | 久久久久亚洲国产 | 亚洲电影一级黄 | 亚洲国产高清视频 | a天堂一码二码专区 | 久久,天天综合 | av高清在线观看 | 国产一二区免费视频 | 999久久久国产精品 高清av免费观看 | www.干| 久久久精品久久日韩一区综合 | 亚洲人成人99网站 | 久久久久女人精品毛片九一 | av东方在线 | 999国内精品永久免费视频 | 黄a在线观看 | 国产午夜一区 | 亚洲夜夜网 | www.啪啪.com| av中文字幕第一页 | 精品在线观看一区二区三区 | 免费黄色av电影 | 国产精品免费看久久久8精臀av | 国产亚洲va综合人人澡精品 | 国产手机在线观看视频 | 99精品国产福利在线观看免费 | 日本中文在线 | 欧美日韩在线免费观看视频 | 国产成人久久精品 | 久久国产视频网 | 日本精品va在线观看 | 国产视频99 | 久久九九国产视频 | 五月婷婷狠狠 | 国产剧情av在线播放 | 精品国产诱惑 | 五月天堂色 | 婷婷色综合网 | 国产精品一区二区三区观看 | 久久国产精品久久久久 | 色婷婷骚婷婷 | 丁香五月缴情综合网 | 婷婷四房综合激情五月 | 丝袜美腿av| 日日草av | 婷婷成人亚洲综合国产xv88 | 久久呀| 国产精品岛国久久久久久久久红粉 | 韩国精品一区二区三区六区色诱 | 日日干夜夜操视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产一二区视频 | 99国产一区 | 伊人网综合在线观看 | 一级成人免费 | 中文字幕的| 日日干干| av免费网站观看 | 久久精品国产精品亚洲 | 成人免费看片网址 | 中文字幕在线观看1 | 欧美激情综合色综合啪啪五月 | 在线免费观看视频a | 国产一级在线视频 | 国产一级在线视频 | 亚洲国产日韩精品 | 欧美日韩高清在线一区 | 久久久久国产成人免费精品免费 | 国产精品久久视频 | 黄污视频网站大全 | 激情五月婷婷综合网 | 玖玖在线资源 | 久久激情视频 久久 | 97电影网手机版 | 精品一区在线看 | 97人人爽人人| 欧美亚洲一区二区在线 | 免费看一级一片 | 中文字幕丝袜 | 欧美 另类 交 | 欧美日韩一区二区三区免费视频 | 成人av电影在线观看 | 一区二区三区中文字幕在线观看 | 探花系列在线 | 91福利视频免费观看 | 国产精品久久久久久久久软件 | 婷色| 视频三区 | 亚洲精品乱码白浆高清久久久久久 | 在线视频福利 | 日韩精品中文字幕有码 | 国产精品mm | 黄色毛片在线观看 | 亚洲日本国产精品 | 99精品久久精品一区二区 | 日韩精品免费一区 | 18av在线视频 | 久久亚洲区 | 国产一区视频免费在线观看 | 国产精品久久久久9999 | 91亚洲精| 久久精品欧美日韩精品 | 色综合夜色一区 | 亚洲国产精品小视频 | 欧美日韩性视频 | 九色视频网站 | 天天操天天干天天插 | 久草精品在线播放 | 久久久免费观看完整版 | 国产尤物在线 | 日韩在线视频免费播放 | www91在线 | 在线免费看黄色 | 热久久99这里有精品 | 成人免费ⅴa | 国产一级黄色av | 久久99婷婷| 中文字幕高清在线 | 成人小视频在线观看免费 | 最近字幕在线观看第一季 | 91福利影院在线观看 | 亚洲香蕉视频 | 在线观看精品黄av片免费 | 国产日本三级 | 欧美日韩精品免费观看视频 | 亚洲国产欧美一区二区三区丁香婷 | 亚洲一区二区三区四区在线视频 | 91麻豆精品91久久久久同性 | 视频一区二区在线 | 一区二区精品久久 | 91探花系列在线播放 | 三级视频国产 | 天天干天天干天天 | 久久国产精品第一页 | 精品国产123 | 婷婷丁香六月天 | 欧美极品在线播放 | 黄色三级久久 | 国产精品一区二区视频 | 欧美视频二区 | 福利视频精品 | 久久久久国产一区二区三区 | 亚洲精品裸体 | 亚洲国产视频网站 | 亚洲不卡在线 | 日韩av中文字幕在线 | 亚洲国产wwwccc36天堂 | 在线精品观看 | 黄色网址av| 91免费版在线观看 | 婷婷亚洲五月色综合 | 欧美日韩国产一二三区 | 四虎影视精品 | 手机在线欧美 | 奇米影视999 | 正在播放一区二区 | 97av影院| 久操视频在线免费看 | 午夜.dj高清免费观看视频 | 久久免费观看视频 | 免费日韩在线 | 久久夜色电影 | 午夜精品久久久久久久99婷婷 | 黄色大片av | 中文字幕丰满人伦在线 | 久久a级片 | 99热九九这里只有精品10 | 欧美日韩一区二区视频在线观看 | 日韩一区二区三区视频在线 | 激情丁香久久 | 91色蜜桃| 久久婷婷精品 | 色的网站在线观看 | 日本久久成人中文字幕电影 | 黄色一级免费电影 | 香蕉视频导航 | 五月天久久久久久 | 福利精品在线 | 三级av免费看 | 丁香在线观看完整电影视频 | 97精品视频在线播放 | 亚洲黄色免费网站 | 玖玖玖在线 | 日本久久久久 | 91亚洲综合 | 日韩偷拍精品 | 园产精品久久久久久久7电影 | 99久久精品国产一区二区成人 | 97视频在线观看视频免费视频 | 九色视频网 | 99精品亚洲 | 92精品国产成人观看免费 | 久久久久久久久久电影 | 亚洲激情综合 | 国产欧美在线一区二区三区 | 国产精品成人一区二区三区吃奶 | av中文字幕免费在线观看 | 久久中文网 | 久久综合免费视频 | 久久久精品福利视频 | 国产精品第7页 | 国产精品九九九 | 在线视频黄 | 国产亚洲一级高清 | 国产精品手机在线观看 | 久久久综合香蕉尹人综合网 | 日日躁夜夜躁aaaaxxxx | 精品免费在线视频 | 色国产精品一区在线观看 | 狠狠色丁香婷婷综合久久片 | 成年人免费电影 | 国产视频一二区 | 久久精品国亚洲 | 国产免费高清视频 | 日韩电影中文字幕 | 亚洲欧美日韩国产精品一区午夜 | 色婷婷免费视频 | 黄色av一区二区三区 | 日韩网站在线播放 | 久久草视频 | 国产在线观看污片 | 午夜国产成人 | 91在线永久| 久草视频在线免费播放 | 草久久影院 | 永久免费观看视频 | 麻豆精品91 | 亚洲欧洲成人精品av97 | 国产亚洲激情视频在线 | 婷婷在线色 | av中文字幕亚洲 | 国产在线观看地址 | 日韩久久精品 | 国产精品久久二区 | 女人魂免费观看 | 精品久久1 | 免费一级片久久 | 99免费在线观看视频 | 久久国产视屏 | 香蕉视频日本 | 午夜狠狠干 | 久久影视中文字幕 | 日韩精品视频在线观看免费 | 婷婷福利影院 | 一区二区 不卡 | 亚洲精品永久免费视频 | 日韩手机在线观看 | 丁香花在线视频观看免费 | 少妇精品久久久一区二区免费 | 欧洲精品在线视频 | 国模一区二区三区四区 | www.成人精品 | 国内精品久久久久影院男同志 | 精品一区二区av | 国产欧美在线一区二区三区 | 国产.精品.日韩.另类.中文.在线.播放 | 黄色一级片视频 | 国产精品美女久久久网av | 成年人免费在线观看网站 | 在线va网站 | 欧美一区在线观看视频 | 日韩大片免费观看 | 懂色av懂色av粉嫩av分享吧 | 特级西西444www高清大视频 | 国产精选视频 | 久久久视屏 | 亚洲激情在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 四虎永久免费在线观看 | 欧美在线观看视频免费 | 国产精品综合久久久久 | 日韩免费在线观看 | 欧洲激情在线 | 欧美精品久久天天躁 | 99色人| 国产一区在线免费观看 | 精品国产一区二区三区久久久蜜月 | 欧美韩日在线 | 欧美性高跟鞋xxxxhd | 亚洲国产中文字幕在线视频综合 | 成人在线观看av | 免费日韩电影 | 国产一区二区视频在线 | 麻豆视频免费播放 | 日本中文字幕网址 | 久久久精品亚洲 | 色婷婷亚洲综合 | 久久久影片 | 亚洲精品国产高清 | 天天综合日日夜夜 | 男女啪啪免费网站 | 久久精品亚洲综合专区 | 国产亚洲精品久久久久久网站 | 激情综合五月网 | 国产小视频精品 | 欧美日一级片 | 亚洲成av人片在线观看香蕉 | 91精品一区国产高清在线gif | 免费看黄的 | 中文在线8新资源库 | 亚洲理论片在线观看 | 黄a在线看| 天天射天天射天天 | 在线综合色 | 亚洲男模gay裸体gay | 97天天综合网 | 黄色三级在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 美女视频黄在线观看 | 四虎国产永久在线精品 | 五月天婷婷狠狠 | 久久精品免费电影 | 亚洲丝袜一区二区 | 韩国精品在线 | 久久精品人 | 国产精品久久99综合免费观看尤物 | 久久久久电影网站 | 开心丁香婷婷深爱五月 | 午夜视频免费 | 麻豆免费精品视频 | 黄色小说免费在线观看 | 国产午夜精品理论片在线 | 日韩免费在线观看网站 | 国产传媒一区在线 | 欧美污在线观看 | 超碰在线99 | 国产第一页精品 | 国产探花视频在线播放 | 国产中文字幕三区 | 黄色视屏免费在线观看 | 精品视频99 | 99色婷婷| 中文字幕在线一区二区三区 | 最新免费av在线 | 国产精品久久久99 | 欧美极品xxx | 91精品国产九九九久久久亚洲 | 色久综合 | 天堂va在线高清一区 | 四虎在线免费观看 | 99精品在线播放 | 天天操天天干天天 | 黄色特级毛片 | 久久精品一区二区三区四区 | 91精品一区二区三区蜜臀 | 四虎在线免费观看视频 | 天天曰夜夜操 | 成人免费视频免费观看 | 在线精品视频在线观看高清 | 天天操夜夜逼 | 黄色亚洲大片免费在线观看 | www蜜桃视频 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 日本一区二区免费在线观看 | 日韩一级片网址 | 不卡的av | 又黄又爽又刺激的视频 | 永久免费毛片在线观看 | 国产亚洲资源 | 欧美激情精品久久久 | 国产免费亚洲 | 亚洲天堂视频在线 | 国产又粗又猛又爽又黄的视频先 | 超碰在线个人 | 欧美久久久久久久久久 | 综合网五月天 | 成人18视频| 美腿丝袜一区二区三区 | 2018亚洲男人天堂 | 99九九99九九九视频精品 | 亚洲精选久久 | 国内三级在线观看 | 偷拍精品一区二区三区 | 黄色视屏在线免费观看 | 久久深夜福利免费观看 | 99在线热播精品免费99热 | 超碰97国产在线 | 亚洲在线精品视频 | 黄色大片免费播放 | 国产日韩精品一区二区 | 视频在线国产 | 国产丝袜 | 久久久久9999亚洲精品 | 日韩r级在线 | 亚洲精品中文字幕在线 | 中文字幕精品在线 | 91亚洲精品久久久中文字幕 | 天天添夜夜操 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91av色| 丁香色综合 | 天天干天天干天天干天天干天天干天天干 | 国产亚洲永久域名 | 91视频观看免费 | 久久久国产精品电影 | 国产精品99久久久精品 | www.狠狠操 | 久久久久97国产 | 亚洲九九九 | 波多野结衣精品在线 | 91高清完整版在线观看 | 99r在线播放 | 手机在线观看国产精品 | 亚洲成人精品 | 一区二三国产 | 一区免费观看 | 欧美色精品天天在线观看视频 | 久久婷婷影视 | 操操操综合 | 玖草影院| 成人性生交大片免费看中文网站 | 久久久久婷 | 不卡视频一区二区三区 | 国产亚洲精品中文字幕 | 中文字幕有码在线播放 | 亚洲精品国产精品国自产观看 | 在线久久 | 夜色成人网 | 久久久久久久久久久久久9999 | 精品专区| 88av视频| 久久久久久久久综合 | 国产性天天综合网 | 国产精品久久久久久久久免费 | 激情综合国产 | 色妞久久福利网 | 久在线观看视频 | www黄在线 | 亚洲国产美女久久久久 | 午夜精品视频在线 | 日日干激情五月 | 爱色婷婷| 91色一区二区三区 | 天天操夜夜操天天射 | 在线精品视频免费播放 | 国产一级黄色免费看 | 久久久久久久久久久福利 | 激情综合五月天 | 91中文字幕网 | 日韩三级.com | 久久人91精品久久久久久不卡 | 精品国偷自产国产一区 | 这里有精品在线视频 | 伊人色综合久久天天网 | 中文字幕av全部资源www中文字幕在线观看 | 欧美ⅹxxxxxx| 免费男女羞羞的视频网站中文字幕 | 99久久久国产精品 | 国产精品高潮久久av | 婷婷色亚洲 | 又爽又黄又无遮挡网站动态图 | 亚洲精品乱码久久久久久蜜桃91 | 国产成人专区 | 五月天丁香综合 | 日本高清dvd | 免费日韩在线 | 欧美色图一区 | 欧美一区免费在线观看 | 久草网视频 | 午夜三级理论 | 狠狠操狠狠干天天操 | 欧美成人久久 | 日韩在线视频精品 | 中文字幕色站 | adn—256中文在线观看 | 91精品国产一区二区在线观看 | 久久精品视频免费播放 | 久久久久久美女 | 亚洲丝袜一区二区 | 精品在线一区二区 | 特级毛片爽www免费版 | 国产二区电影 | 日本一区二区免费在线观看 | 国产精品一区二区免费在线观看 | 国内精自线一二区永久 | 伊人影院99 | 国产不卡av在线 | 日韩激情片在线观看 | 7799av| 久久视频免费观看 | 91视频免费视频 | 二区三区精品 | 五月婷婷中文 | 成人天堂网 | 日韩免费不卡视频 | 国产成人精品久久二区二区 | 久久8精品 | 免费视频你懂的 | 亚洲激情 欧美激情 | 成人在线网站观看 | 成人av日韩 | 日韩在线观看高清 | 毛片网在线观看 | 国产精品女主播一区二区三区 | 国产精品18久久久久vr手机版特色 | 成人av一区二区三区 | 99久久夜色精品国产亚洲 | 日韩丝袜在线观看 | 一级理论片在线观看 | 久久久久久久久久久久av | 五月花丁香婷婷 | 久久免费a | 日韩r级在线 | 欧美日韩国产亚洲乱码字幕 | 波多野结衣综合网 | av在线免费播放网站 | 亚洲人在线7777777精品 | 六月丁香婷婷久久 | 午夜久久视频 | 高清不卡毛片 | 精品国产一区二区三区男人吃奶 | 日韩a在线看 | 中文理论片 | 国产免费一区二区三区网站免费 | 狠狠操狠狠干天天操 | 婷婷精品国产一区二区三区日韩 | 手机看片99 | 人人超碰在线 | 成年人免费观看在线视频 | 久久久影院一区二区三区 | 久久人人精| 免费看亚洲毛片 | 欧美一级免费片 | 久久精品草 | 婷婷色网视频在线播放 | 国产一区国产二区在线观看 | 99热超碰在线| 婷婷精品在线视频 | 国产精品一区二 | 99久久精品久久亚洲精品 | 中文字幕一区二区三区四区视频 | 91精品成人久久 | 日韩精品视频免费看 | 国产成本人视频在线观看 | 很黄很黄的网站免费的 | 国产色小视频 | 久久激情视频 久久 | 久久爱资源网 | 久久伊人色综合 | 91福利国产在线观看 | 在线免费观看视频 | 91精品毛片 | 日韩在线视频观看免费 | 中文字幕亚洲五码 | 欧美成人在线免费 | 91看片在线免费观看 | 91一区二区三区在线观看 | 久久综合久久88 | 成人av中文字幕 | 久草在线一免费新视频 | 蜜桃传媒一区二区 | 亚洲精品男女 | 国产精品久久久久久久久久尿 | 伊人色综合久久天天 | 国产综合片 | 亚洲国产欧美一区二区三区丁香婷 | 亚洲第二色 | 国产亚洲精品久久网站 | 亚洲欧美成人网 | 超碰在线97观看 | 综合久久综合久久 | 狠狠干狠狠久久 | 久草在线最新免费 | 亚洲五月激情 | 久久久久免费精品国产小说色大师 | 中文字幕乱码电影 | 91黄色小视频 | 五月婷婷综合网 | 国产精品高潮呻吟久久av无 | 亚洲激情精品 | 草久在线视频 | 国产精品久久久一区二区三区网站 | 久久久免费网站 | 天天综合天天做天天综合 | 久久视精品 | 久热电影 | 成人久久毛片 | www.久久com| 色综合天天综合 | 精品毛片在线 | 欧美三级高清 | 四虎成人精品永久免费av九九 | 国产视频精品免费 | 午夜精品一区二区三区视频免费看 | 丁香视频五月 | 国产成人av一区二区三区在线观看 | 中文字幕在线观看三区 | 日韩三级在线观看 | av高清免费在线 | 亚洲激情在线观看 | 亚洲va欧洲va国产va不卡 | 99热超碰| 日韩在线免费播放 | 久久蜜臀一区二区三区av | 狠狠色丁香婷婷综合 | 欧美巨乳波霸 | 久久亚洲美女 | 五月婷婷网站 | 久久久www成人免费毛片麻豆 | 成人四虎 | 91爱爱网址 | 久久婷婷国产色一区二区三区 | av片免费播放 | 二区中文字幕 | av看片在线 | 国产精品免费一区二区三区在线观看 | 国产午夜精品av一区二区 | 日日爱视频 | 亚洲黑丝少妇 | 涩涩网站在线观看 | 中文字幕一区二区三区久久蜜桃 | 国产精品精品久久久久久 | 久久成人一区二区 | 六月丁香激情综合色啪小说 | 欧美一级视频一区 | 国产精品男女啪啪 | 天天综合网 天天综合色 | 精品一区精品二区 | 国产视频精品免费播放 | av一级片在线观看 | 91麻豆精品一区二区三区 | 精品国产乱码久久久久久久 | 亚洲三级在线播放 | 国产麻豆精品在线观看 | 日韩aa视频 | 国产剧情亚洲 | av高清一区| 欧美一区二区视频97 | 国产专区免费 | 日韩一区二区三 | 欧美与欧洲交xxxx免费观看 | 久久a v视频 | 日产乱码一二三区别在线 | 欧美久久成人 | 久久久久久久久久国产精品 | 国产a国产a国产a | 在线免费观看视频一区 | 日日干日日 | 97超碰人人在线 | 欧美日韩一区二区三区免费视频 | 国产 亚洲 欧美 在线 | 五月婷婷视频在线 | 天天夜夜狠狠操 | 亚洲成人欧美 | 91免费国产在线观看 | 手机看国产毛片 | 国产精品免费观看视频 | 美女网站视频免费黄 | 在线av资源 | 亚洲麻豆精品 | 欧美成人久久 | 欧美国产日韩在线视频 | 国产亚洲成av片在线观看 | 国产成人精品女人久久久 | 久久久久区| 国产麻豆精品传媒av国产下载 | 午夜av在线电影 | 欧美有色| av电影免费在线播放 | 在线观看aa | 99久久毛片 | 欧美日韩一区二区在线观看 | 中文字幕在线一区二区三区 | 黄色一级大片在线免费看国产一 | 99精品国产99久久久久久福利 | 欧美日韩国语 | 狠狠网亚洲精品 | 最近最新中文字幕视频 | 亚洲1区在线 | 韩国一区二区三区视频 | 午夜精品电影 | 久久草在线视频国产 | 国产成人91| 免费一级片在线 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 色综合久久88色综合天天免费 | 午夜影院在线观看18 | 蜜臀久久99精品久久久无需会员 | 欧美吞精 | 国产精品免费久久久久久久久久中文 | 色婷婷久久久综合中文字幕 | 一级全黄毛片 | 国产成人一区二区三区久久精品 | 成人久久免费 | 九九热av | 亚洲天天在线 | 日韩在线视频免费观看 | 最近最新最好看中文视频 | 日本中文字幕影院 | 五月导航 | 亚洲日本韩国一区二区 | 麻豆影音先锋 | 久久精品视频在线看 | 在线观看成年人 | 麻豆国产精品一区二区三区 | 日日夜夜精品视频天天综合网 | 久久国产亚洲视频 | 国产精品精品久久久 | 91成人免费看片 | 国产一区视频在线播放 | 欧美成人黄色片 | 九九热免费精品视频 | 国产成人精品一区二区 | 人人爱人人做人人爽 | 欧美日韩国产在线精品 | 国产激情电影综合在线看 | 西西人体4444www高清视频 | 国产91精品一区二区麻豆网站 | 69av视频在线 | 91精品视屏| 日韩网站在线播放 | 91视频专区| 六月丁香婷 | 久久精品男人的天堂 | 五月婷婷亚洲 | 日韩综合一区二区三区 | 中文字幕一区二区三区久久 | 区一区二区三在线观看 | 97超碰免费在线观看 | 在线视频 国产 日韩 | 91中文字幕在线视频 | 免费国产亚洲视频 | 国内精品视频免费 | 国产乱对白刺激视频在线观看女王 | 国产一级在线 | 在线看片视频 | 欧美精品免费在线观看 | 欧美性生活一级片 | 视频1区2区 | 中文字幕在线播放一区 | 99日精品 | 亚洲综合小说电影qvod | 午夜电影久久久 | 成人超碰在线 | av资源网在线播放 | 久久久久久久久久久久久久免费看 | 麻豆精品传媒视频 | 99精品国产一区二区三区麻豆 | 欧美性色xo影院 | 欧美精品久久久久久久 | 欧美成人亚洲 | 日本午夜免费福利视频 | 日韩理论电影网 | 婷婷色九月 | 亚洲精选99 | 又色又爽又激情的59视频 | 深爱激情五月网 | 中文永久免费观看 | 天天干天天干天天干 | 日韩欧美视频免费在线观看 | 亚洲精品国产综合久久 | 韩国av一区二区三区在线观看 | 制服丝袜成人在线 | 国产成人精品一区在线 | 日韩在线三级 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久天天拍| 91久久国产自产拍夜夜嗨 | av网站在线免费观看 | 黄av在线 | 99九九热只有国产精品 | 国产精品国内免费一区二区三区 | 国产精品久久99综合免费观看尤物 | 国产二区电影 | 精品日韩视频 | 四虎影视成人精品 | 91尤物在线播放 | 精品久久精品久久 | 午夜私人影院 | 国产手机在线播放 | 91丨九色丨高潮 | 91精品在线免费视频 | 99r在线视频 | 97在线观看免费观看高清 | 久久久久高清毛片一级 | 一本一本久久a久久 | 超碰人人干人人 | 国产精品自产拍在线观看桃花 | 日韩欧美精品在线观看视频 | 6080yy精品一区二区三区 | 人人插人人费 | 日韩亚洲国产中文字幕 | 日本女人逼 | 精品视频国产一区 | 国产综合福利在线 | 国内视频在线 | 欧洲精品在线视频 | 国产精品h在线观看 | 日日婷婷夜日日天干 | 99热只有精品在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 黄色精品一区二区 | 亚洲综合在线五月 | 波多野结衣视频一区二区三区 | 伊人久久在线观看 | 久免费视频 | 亚洲一级黄色大片 | 三级黄色免费 | 黄色的片子 | 久久视频一区二区 | 国产成人精品一区二区三区免费 | 国产高清成人av | 国产精品白丝jk白祙 | 免费在线观看视频a | 国产精品国产精品 | 国产在线观看一 | 免费看特级毛片 | 精品国产伦一区二区三区观看体验 | 日日麻批40分钟视频免费观看 | 久久久在线观看 | 久99久视频 | 又黄又刺激 | 国产真实在线 | 一二三四精品 | 久久国产精品99精国产 | 国产美女视频一区 | 国产精品手机在线播放 | 免费一级片在线 | 国产精品久久久av久久久 | 伊人久久一区 | 99视频免费观看 | 成人午夜精品久久久久久久3d | 九九热精品视频在线播放 | 亚洲欧美少妇 | 视频一区二区免费 | 一本一本久久aa综合精品 | 久久成人精品 | 国产资源在线免费观看 | 亚洲精品在线一区二区三区 | 国产亚洲免费的视频看 | 精品国产一区二区三区蜜臀 | 免费日韩一级片 | 福利一区二区三区四区 | 免费看一级黄色大全 | 久久66热这里只有精品 | 色噜噜色噜噜 | 91免费看黄色 | 欧美一区二区免费在线观看 | 99精品视频免费 | 亚洲精品国产精品乱码在线观看 | 99在线观看视频 | 久久成人一区 | 婷婷久久一区 | 在线观看你懂的网址 | 99视频在线播放 | 毛片无卡免费无播放器 | 日韩成人中文字幕 | 超碰在线97国产 | 国产精品中文字幕在线播放 | 午夜精品久久久久久久久久久久久久 | 91手机电视 | 成人久久电影 | 国产精品久久久亚洲 | 激情欧美日韩一区二区 | 久草资源在线 | 亚洲国内精品 | 欧美激情综合五月色丁香小说 | 日韩免费视频播放 | 欧美一级片免费 | 在线观看岛国 | 精品中文字幕在线观看 | 国产成人福利在线 | 人人爱夜夜操 | va视频在线 | 在线免费观看涩涩 | 色一级片 | 日日操天天操狠狠操 | 很黄很色很污的网站 | 久久综合狠狠综合久久激情 | 久久久午夜精品福利内容 | 久久精品国产一区二区三区 | 久草久草在线观看 | 日本99干网 | 久久亚洲婷婷 | www.精选视频.com | 国产精品va在线观看入 | 国产精品视频永久免费播放 | 国产三级视频在线 | 五月婷视频 | 一区二区三区高清在线 | 在线观看免费国产小视频 | 日韩美女一级片 | av免费片 | 中文字幕在线观看第一页 | 一区二区三区免费在线观看视频 | 99爱在线观看 | 黄网av在线| 成人小视频免费在线观看 | 国产麻豆精品传媒av国产下载 | 国产在线中文 | 69国产成人综合久久精品欧美 | 国产一区视频在线 | 欧美精品一区在线发布 | 在线播放av网址 | 国产欧美精品一区二区三区 | 久久国产成人午夜av影院宅 | 丝袜美腿亚洲 | 国产色秀视频 | 成人亚洲综合 | 免费a一级| 免费观看一级成人毛片 | 国产综合精品久久 | 欧美久久久久久久久久久久久 | 在线视频 国产 日韩 | 亚洲砖区区免费 | 国产综合福利在线 | 久久久久久久久久久久久国产精品 | 偷拍精品一区二区三区 | 精品国产成人av在线免 | 粉嫩av一区二区三区入口 | 激情导航 | 97电影网站 | 久久精品免视看 | 欧美日韩国产精品一区二区 | 99久久久国产精品免费99 | 在线高清 | 婷婷色站 | 日韩精品一区二区三区视频播放 | 天天射网站 | 成人小视频免费在线观看 | 亚洲 欧美 综合 在线 精品 | 亚洲h在线播放在线观看h | 中文av日韩| 中文字幕在线播放第一页 | 精品亚洲免费视频 | 涩涩网站在线播放 | 999电影免费在线观看2020 | 久久国产精品一区二区 | 天天操天天操天天操天天操天天操天天操 | а天堂中文最新一区二区三区 | 97精品一区 | 亚洲国产久 | 激情网五月天 | ,午夜性刺激免费看视频 | 国内亚洲精品 | 在线免费亚洲 | 中文字幕在线观看免费 | 日韩精品免费在线观看视频 | av中文在线影视 | 成人免费共享视频 | 国产精品麻豆三级一区视频 | 色全色在线资源网 | 日韩精品一区二区三区高清免费 | 999热视频 | 久久精品欧美一 | 在线黄网站 | 国产国语在线 | 久影院 | 午夜精品一区二区三区可下载 | 国产精品日韩在线 |