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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql odbc c语言_C语言ODBC操作MySQL数据库(示例代码)

發布時間:2023/12/8 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql odbc c语言_C语言ODBC操作MySQL数据库(示例代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫及其編程API來源于不同的背景,開發人員可以從眾多的數據庫中選擇一種,每種數據庫都有自己的一套編程API,這就為數據庫編程造成了很大的局限性。SQL是標準化數據庫編程接口的一種嘗試,然而各種數據庫所支持的SQL又有所不同。

ODBC的設計目的是允許訪問多種數據庫,ODBC為數據庫供應商提供了一致的ODBC驅動程序標準,遵循這個標準開發的數據庫驅動程序,都可以被開發人員通過ODBC

API透明地訪問,而不必關心實際的數據庫是什么。在這里,ODBC所做的,就是接收開發人員的數據庫操作指令,調用相應的ODBC驅動程序,向一個數據庫或者向多個數據庫發送數據,并可接收來自數據庫的數據。

ODBC提供了訪問數據庫的標準,這使得開發人員將精力集中在應用程序以及用戶接口的開發上,而不必考慮與之相連的數據庫。為了進一步簡化開發工作,ODBC把API層實現為SQL的映射器。通常數據庫開發人員將標準的SQL語句發送給ODBC驅動程序,再由ODBC驅動程序將這個SQL語句映射成數據庫可以支持的SQL語句。

本章首先對ODBC API的概貌進行簡要介紹,然后講述利用ODBC API進行數據庫開發的技巧,最后將通過具體數據庫開發實例,詳細講述通過ODBC API開發數據庫應用程序的方法和過程。

1了解ODBC API

ODBC是一種使用SQL的程序設計接口。使用ODBC讓應用程序的編寫者避免了與數據源相聯的復雜性。這項技術目前已經得到了大多數DBMS廠商們的廣泛支持。ODBC是一種使用SQL 的程序設計接口。使用ODBC讓應用程序的編寫者避免了與數據源相聯的復雜性。這項技術目前已經得到了大多數DBMS廠商們的廣泛支持。

Microsoft Developer Studio為大多數標準的數據庫格式提供了32位ODBC驅動器。這些標準數據格式包括有:SQL Server,Access,Paradox,dBase,FoxPro,Excel,Oracle 以及Microsoft Text。如果用戶希望使用其他數據格式,用戶需要相應的ODBC驅動器及DBMS。

ODBC API是一個內容豐富的數據庫編程接口,包括60多個函數、SQL數據類型以及常量的聲明。ODBC API 是獨立于DBMS和操作系統的,而且它與編程語言無關。ODBC API 以X/Open和ISO/IEC中的CLI規范為基礎,ODBC 3.0完全實現了這兩種規范,并添加了基于視圖的數據庫應用程序開發人員所需要的共同特性,例如可滾動光標。ODBC API中的函數由特定DBMS驅動程序的開發人員實現,應用程序用這些驅動程序調用函數,以獨立于DBMS的方式訪問數據。

ODBC API涉及了數據源連接與管理、結果集檢索、數據庫管理、數據綁定、事務操作等內容,目前的最高版本是3.0。

通常使用ODBC API開發數據庫應用程序需要經過如下步驟:

·??????連接數據源。

·??????分配語句句柄。

·??????準備并執行SQL語句。

·??????獲取結果集。

·??????提交事務。

·??????斷開數據源連接并釋放環境句柄。

下面對上述步驟做詳細的介紹。

步驟1:連接數據源

為了連接數據源,必須要建立一個數據源連接的環境句柄。通過調用SQLAllocEnv函數實現對環境句柄的分配,在ODBC 3.0里,這個函數已經被SQLAllocHandle取代,但是熟悉ODBC API的開發人員還是習慣用這個函數建立環境句柄,因為VC++開發平臺有一個映射服務,這個服務將程序代碼對函數SQLAllocEnv的調用轉向對函數SQLAllocHandle的調用。

這里有必要對“環境句柄”這個概念進行說明。句柄是指向一個特殊結構的指針,而環境指的是驅動程序管理器需要為該驅動程序存儲的有關系統和數據源的一般信息。由于這個時候還沒有建立同數據源的連接,驅動程序還并不知道該使用哪一個驅動程序來完成這個任務,所以這個任務只能由驅動程序管理器來完成,利用這個環境句柄保留信息直到被使用。

使用函數SQLAllocEnv創建環境句柄的語法如下:

HENV? henv;

RETCODE?rcode;

rcode = ::SQLAllocEnv(SQL_HANDLE_ENV, SQL_NULL,& henv);

if(rcode == SQL_SUCCESS)?? // 環境句柄創建成功

{

// 執行其它操作

…………

}

完成了環境句柄的創建以后,還要建立一個連接句柄。連接句柄的創建函數是SQLAllocConnect,其調用語法如下:

HDBC?? hdbc;

retcode = ::SQLAllocConnect( m_henv, & hdbc);

if(rcode == SQL_SUCCESS)?? // 連接句柄創建成功

{

// 執行其它操作

…………

}

完成了環境句柄和連接句柄的創建以后,就可以進行實際的數據源連接了。完成數據源連接的函數是SQLConnect,其調用語法如下:

m_retcode = :: SQLConnect( m_hdbc,

(PUCHAR)pszSourceName,SQL_NTS,

(PUCHAR)pszUserId,wLengthUID,

(PUCHAR)pszPassword,wLengthPSW );

if(rcode == SQL_SUCCESS)?? // 數據源連接成功

{

// 執行其它操作

…………

}

到此,應用程序同數據源的連接已經完成。

有些時候,ODBC數據源并不是事先在用戶的計算機里安裝好了的,這時就需要應用程序能夠動態創建ODBC數據源。ODBC API提供了動態創建數據源的函數SQLConfigDataSource。該函數的語法如下:

BOOL SQLConfigDataSource(HWND? hwndParent,

WORD? fRequest,

LPCSTR? lpszDriver,

LPCSTR? lpszAttributes);

參數hwndParent用于指定父窗口句柄,在不需要顯示創建數據源對話框時,可以將該參數指定為NULL;參數fRequest用于指定函數的操作內容,函數SQLConfigDataSource能夠實現的操作內容由參數fRequest制定,參數fRequest取值如下:

ODBC_ADD_DSN:創建數據源;

ODBC_CONFIG_DSN:配置或者修改已經存在的數據源;

ODBC_REMOVE_DSN:刪除已經存在的數據源;

ODBC_ADD_SYS_DSN:創建系統數據源;

ODBC_CONFIG_SYS_DSN:配置或者修改已經存在的系統數據源;

ODBC_REMOVE_SYS_DSN:刪除已經存在的系統數據源;

ODBC_REMOVE_DEFAULT_DSN:刪除缺省的數據源。

參數lpszDriver用于指定ODBC數據源的驅動程序類別,例如,為了指定Access數據源,該參數應賦以字符串“MicrosoftAccess Driver (*.mdb)\0”。 參數lpszAttributes用于指定ODBC數據源屬性,例如:

“DSN=MYDB\0DBQ=D:\\Database\\Friends.mdb\0DEFAULTDIR=D:\\DATABASE\0\0”

該字符串指定數據源名稱(DSN)為MYDB,數據庫文件(DBQ)為D:\Database\Friends.mdb,缺省數據庫文件路徑(DEFAULTDIR)為D:\DATABASE。

通過調用如下代碼可以通過應用程序動態創建數據源MYDB:

BOOL CreateDSN()

{

char*szDesc;

intmlen;

szDesc=newchar[256];

sprintf(szDesc,"DSN=%s:DESCRIPTION=TOC support source: \

DBQ=%s:FIL=MicrosoftAccess: \

DEFAULTDIR=D:\\Database::","TestDB","D:\\Friends.mdb");

mlen= strlen(szDesc);

for(int i=0; i

if(szDesc[i] == ‘:‘)?????? ? szDesc[i] = ‘\0‘;

}

if (FALSE ==SQLConfigDataSource(NULL,ODBC_ADD_DSN,

"MicrosoftAccess Driver (*.mdb)\0",

(LPCSTR)szDesc))

returnFALSE; // 創建數據源失敗。

else

returnTRUE; // 創建數據源成功。

}

步驟2:分配語句句柄

通常將ODBC中的語句看作SQL語句。前面已經提到,ODBC同數據庫的SQL接口通信,驅動程序將ODBC的SQL映射到驅動程序的SQL。但是ODBC的SQL還攜帶了一些屬性信息,用于定義數據源連接的上下文,有些語句要求特殊的參數以便能夠執行,因此,每個語句都有一個指向定義語句所有屬性結構的句柄。

語句句柄的分配同環境句柄的分配相似,通過函數SQLAllocStmt實現,該函數的調用語法如下:

HSTMT ???hstmt;

RETCODE?rcode;

m_retcode = :: SQLAllocStmt(hdbc, ?&hstmt );

if(rcode == SQL_SUCCESS)?? // 連接句柄創建成功

{

// 執行其它操作

…………

}

步驟3:準備并執行SQL語句

對于不同的應用程序需求,要準備的SQL語句也一定不一樣。通常的SQL語句包括SELECT、INSERT、UPDATA、DELETE、DROP等。

準備和執行一個SQL語句的方法有兩種,第一種是使用SQLExecDirect函數,可以一次執行一個SQL語句。很多請求都可以使用這個方法。調用SQLExecDirect函數的語法如下:

LPCSTR pszSQL;

strcpy(pszSQL, “SELECT * FROM EMPLOYEES”);

retcode = ::SQLExecDirect(hstmt, ?(UCHAR*)pszSQL, ?SQL_NTS );

if(rcode == SQL_SUCCESS)?? // SQL語句執行成功

{

// 執行其它操作

…………

}

但是有些請求需要多次執行同一條語句,為此,ODBC提供了SQLPrepare函數和SQLExecute函數。調用的時候,只需要調用一次SQLPrepare函數,然后調用若干次SQLExecute函數。實際上,函數SQLExecDirect將SQLPrepare和SQLExecute的功能集中到了一起,多次調用SQLExecDirect顯然比調用一次SQLPrepare再調用若干次SQLExecute效率高。調用SQLPrepare和SQLExecute函數的語法如下:

LPCSTR pszSQL;

strcpy(pszSQL, “SELECT * FROM EMPLOYEES”);

m_retcode = ::SQLPrepare( hstmt, ?(UCHAR*)pszSQL, ?SQL_NTS );

if(rcode == SQL_SUCCESS)?? // SQL語句準備成功

{

// 執行其它操作

…………

}

retcode = :: SQLExecute (hstmt, ?(UCHAR*)pszSQL, ?SQL_NTS );

if(rcode == SQL_SUCCESS)?? // SQL語句執行成功

{

// 執行其它操作

…………

}

步驟4:獲取結果集

SQL語句執行成功以后,應用程序必須準備接收數據,應用程序需要把SQL語句執行結果綁定到一個本地緩存變量里。但是SQL執行語句執行的結果并不是直接傳送給應用程序,而是在應用程序準備接收數據的時候通知驅動程序其已經準備好接收數據,應用程序通過調用SQLFetch函數返回結果集的一行數據。

由于返回的數據是存放在列中的,因此應用程序必須調用SQLBindCol函數綁定這些列。通常接收結果集時需要依次進行以下操作:

·??????返回列的個數,執行SQLNumResultCols函數。

·??????給出列中數據的有關信息,例如列的名稱、數據類型和精度等,執行SQLDescribeCol函數。

·??????把列綁定到應用程序的變量里,執行SQLBindCol函數。

·??????獲取數據,執行SQLFetch函數。

·??????獲取長數據,執行SQLGetData函數。

應用程序首先調用SQLNumResultCols函數,獲知每個記錄里有多少列,調用SQLDescribeCol函數取得每列的屬性,然后調用SQLBindCol函數將列數據綁定到指定的變量里,最后調用SQLFetch函數或者SQLGetData函數獲取數據。

對于其它的SQL語句,應用程序重復這個過程。這個過程代碼如下:

retcode = ::SQLNumResultCols( m_hstmt,&wColumnCount );

if( m_retcode != SQL_SUCCESS ) // 列舉結果集列的個數不成功

{

// 釋放操作

…………

return;

}

LPSTR?? pszName;

UWORD? ???????? URealLength;

SWORD? ???????? wColumnCount;

UWORD? ???????? wColumnIndex = 0;

SWORD? ???????? wColumnType;

UDWORD ??????? dwPrecision;

SWORD? ???????? wScale;

SWORD? ???????? wNullable;

m_retcode = ::SQLDescribeCol( m_hstmt,

wColumnIndex,?// 列的索引

pszName,??? // 列的名稱

256, ???// 存放列名稱的緩沖區大小

& nRealLength, ?// 實際得到列名稱的長度

&wColumnType,? // 列的數據類型

&dwPrecision,? // 精度

&wScale, // 小數點位數

&wNullable );? // 是否允許空值

if(retcode != SQL_SUCCESS ) // 執行不成功

{

// 釋放操作

…………

return;

}

retcode = ::SQLBindCol( m_hstmt,

uCounter, // 列索引

wColumnType, // 列數據類型

FieldValue, // 綁定的變量

dwBufferSize, // 變量內存大小

&BytesInBuffer); // 存放將來返回數據的大小的變量

if(retcode != SQL_SUCCESS ) // 執行不成功

{

// 釋放操作

…………

return;

}

::SQLFetch( m_hstmt );

// 此后可以從綁定的變量里讀取列的值。

…………

步驟5:提交事務

當所有的SQL語句都被執行并接收了所有的數據以后,應用程序需要調用SQLEndTran提交或者回退事務。如果提交方式為手工(應用程序設置)方式,則需要應用程序執行這個語句以提交或者回退事務,如果是自動方式,當SQL語句執行后,該命令自動執行。

事務是為了維護數據的一致性和完整性而設計的概念,事務要求:要么提交,將事務里包含的更新操作都提交到數據庫里;要么回退,數據庫恢復到事務前的狀態,不會影響數據庫的一致性和完整性。通常情況下,檢索類SQL語句不涉及數據的更新,不會對數據的一致性和完整性產生影響,因此通常將檢索類SQL語句設置提交方式為自動,而將更新類SQL語句的提交方式設置為手工方式,便于通過代碼在事務處理中執行事務的提交或者回退,以維護數據庫的一致性和完整性。在大型的商業應用中,這個設置非常有用。

調用SQLEndTran函數的語法如下:

:: SQLEndTran(SQL_HANDLE_DBC , hdbc,? SQL_COMMIT); // 提交事務

:: SQLEndTran(SQL_HANDLE_DBC , hdbc,? SQL_ROLLBACK); // 回退事務

步驟6:斷開數據源連接并釋放環境句柄

當應用程序使用完ODBC以后,需要使用SQLFreeHandle函數釋放所有語句句柄、連接句柄、環境句柄。這里需要注意操作的順序,應該是先釋放所有語句句柄,調用SQLDisconnect函數解除與數據源的連接,然后釋放所有連接句柄,最后釋放環境句柄,使應用程序同ODBC管理器的連接徹底解除。

一個封裝好的C語言odbc操作mysql的源碼分享給大家,這里需要注意的是我們的工程需要選擇使用多字節字符集

odbc.h

typedef char CHAR;

typedef signed int INT32;

typedefunsigned long U_LONG;

#defineSUCCESS1

#defineFAILURE0

#ifndef __ODBD_H__

#define __ODBC_H__

#ifdef __cplusplus

extern "C" {

#endif

#define CONLEN sizeof(CONSTR)-1

#define SQL_QUERY_BUFF_SIZE 512

#define CON_STR_LEN 255

#ifdef ODBC_PUBLIC

SQLHENV hEnv = 0;

SQLHDBC hDBC = 0;

SQLHSTMT hStmt = 0;

SQLRETURN retcode;

SQLCHAR szConStr[CON_STR_LEN];

SQLCHAR szStmt[SQL_QUERY_BUFF_SIZE];

INT16 cbConLen;

#endif

/*

* Function protypes are declared here

*/

void InitAndConnectToDBS(void);

CHAR InsertRowIntoDBS(CHAR *tName, CHAR *queryStr, INT32 queryStrLen);

CHAR** GetFieldValuesFromDBS(CHAR* qStr, INT32 noOfCols, INT32 len, U_LONG **resultPtrLen);

void CloseConnectionToDBS(void);

CHAR UpdateColumnsInDBS(CHAR *tName, CHAR* queryStr, INT32 queryStrLen);

void FreeDBSResultPtr(CHAR **ptr, INT32 cnt, U_LONG *ptrLen);

void PrintDBSError(void);

CHAR DeleteRowFromDBS(CHAR* queryStr, INT32 queryStrLen);

#ifdef __cplusplus

}

#endif

#endif /* ifndef __ODBC_H__ */odbc.c

#ifdef __cplusplus

extern "C" {

#endif

#include

#include

#include

#include

#include

#define ODBC_PUBLIC

#include "odbc.h"

/**************************************************************************

*Function Name: InitAndConnectToDBS()

*

*Args: Nothing

*

*Returns: Nothing

*

*Task: Establishes connection with database server.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

void InitAndConnectToDBS(void)

{

/*RETCODE rc;

rc = SQLAllocEnv(&hEnv) ;

if( rc != SQL_SUCCESS)

{

PrintDBSError();

DEBUGMSG1("Unable to connect with database 1\n");

return;

}

rc = SQLAllocConnect(hEnv,&hDBC);

if( rc != SQL_SUCCESS)

{

PrintDBSError();

DEBUGMSG1("Unable to connect with database 2\n");

return;

}

rc = SQLDriverConnect(hDBC,NULL,CONSTR,CONLEN,

szConStr,sizeof(szConStr), &cbConLen,SQL_DRIVER_NOPROMPT);

if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)

{

PrintDBSError();

DEBUGMSG1("Unable to connect with database 3\n");

return;

}*/

/*Step 1 定義句柄和變量 */

// 分配環境句柄

retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

if (retcode != SQL_SUCCESS)

{

printf("SQLAllocHandle error!");

return -1;

}

// 設置環境句柄

retcode = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);

if (retcode != SQL_SUCCESS)

{

printf("SQLSetEnvAttr error!");

return -2;

}

// 分配連接句柄

retcode = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);

if (retcode != SQL_SUCCESS)

{

printf("SQLAllocHandle error!");

return -3;

}

/*之上的程序代碼讀者直接粘貼即可,無限修改;至于具體語句或函數的功能,沒有必要深入了解,只要清楚每一步的作用(注釋給出)即可*/

/* 連接ODBC數據庫,主要函數中第二個參數test為操作的數據源的名稱;第四個參數是操作數據庫的用戶名;第六個參數是操作數據庫的密碼*/

retcode = SQLConnect(hDBC, (SQLCHAR *)"videodetectodbc", SQL_NTS, (SQLCHAR *)"root",

SQL_NTS, (SQLCHAR *)"root", SQL_NTS);

if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)

{

printf("SQLConnect error!");

return -4;

}

DEBUGMSG1("Successfully Connected........\n");

}/* End of InitAndConnectToDBS */

/**************************************************************************

* Fucntion Name: CloseConnectionToDBS()

*

*Args: Nothing

*

*Returns: Nothing

*

*Task: Closes connection with database server .

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

void CloseConnectionToDBS(void)

{

if (hDBC)SQLDisconnect(hDBC);

if (hDBC)SQLFreeConnect(hDBC);

if (hEnv)SQLFreeEnv(hEnv);

}/* End of CloseConnectionToDBS */

/**************************************************************************

*Function Name: GetFieldValuesFromDBS()

*

*Args: 1. SQL query string(IN).

* 2. Number of columns(IN).

* 3. Length of each columns(OUT).

*

*Returns: Column values.

*

*Task: Retrives all column values from database for the given

* SQL select query string.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

CHAR** GetFieldValuesFromDBS(CHAR* queryStr, INT32 noOfCols, INT32 len, U_LONG **resultPtrLen)

{

INT32 i;

CHAR **resultPtr;

LONG *lengths;

RETCODE rc;

resultPtr = (CHAR**)__Malloc(sizeof(CHAR*)*noOfCols);

if (resultPtr == NULL)

{

DEBUGMSG1("Memory allocation failed\n");

return NULL;

}

lengths = (LONG *)__Malloc(sizeof(LONG)*noOfCols);

if (lengths == NULL)

{

DEBUGMSG1("Memory allocation failed\n");

__Free(resultPtr);

return NULL;

}

*resultPtrLen = (U_LONG*)__Malloc(sizeof(U_LONG)*noOfCols);

if (*resultPtrLen == NULL)

{

DEBUGMSG1("Memory allocation failed\n");

return NULL;

}

rc = SQLAllocStmt(hDBC, &hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return NULL;

}

for (i = 0; i

DEBUGMSG2("%c", queryStr[i]);

DEBUGMSG1("\n");

rc = SQLPrepare(hStmt, queryStr, __Strlen(queryStr));

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return NULL;

}

for (i = 0; i < noOfCols; i++)

{

resultPtr[i] = (CHAR *)__Malloc(255);

if (resultPtr[i] == NULL)

{

DEBUGMSG1("Memory allocation failed\n");

while (--i >= 0) __Free(resultPtr[i]);

__Free(resultPtr);

__Free(lengths);

return NULL;

}

rc = SQLBindCol(hStmt, i + 1, SQL_C_CHAR, (PTR)resultPtr[i], 255, &lengths[i]);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return NULL;

}

}

rc = SQLExecute(hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return NULL;

}

rc = SQLFetch(hStmt);

if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)

{

for (i = 0; i < noOfCols; i++)

{

(*resultPtrLen)[i] = lengths[i];

resultPtr[i][lengths[i]] = '\0';

}

if (hStmt)SQLFreeStmt(hStmt, SQL_DROP);

__Free(lengths);

return resultPtr;

}

else

{

DEBUGMSG1("Error in fetching values......\n");

if (hStmt)SQLFreeStmt(hStmt, SQL_DROP);

__Free(lengths);

return NULL;

}

}/* End of GetFieldValuesFromDBS */

/**************************************************************************

*Function Name: InsertRowIntoDBS()

*

*Args: 1. Table Name (IN).

* 2. Query string(IN).

*

*Returns: SUCCESS/FAILURE.

*

*Task: Adds new row in a given table.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

CHAR InsertRowIntoDBS(CHAR* tName, CHAR* queryStr, INT32 queryStrLen)

{

RETCODE rc;

CHAR szStmt[SQL_QUERY_BUFF_SIZE];

INT32 i;

INT32 tempLen;

sprintf(szStmt, "insert into %s values(", tName);

tempLen = __Strlen(szStmt);

__Memcpy(szStmt + tempLen, queryStr, queryStrLen);

tempLen = tempLen + queryStrLen;

szStmt[tempLen] = '\0';

for (i = 0; i

{

DEBUGMSG2("%c", szStmt[i]);

}

DEBUGMSG1("\n");

rc = SQLAllocStmt(hDBC, &hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLPrepare(hStmt, szStmt, SQL_NTS);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLExecute(hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

if (hStmt)SQLFreeStmt(hStmt, SQL_DROP);

return SUCCESS;

}/* End of InsertRowIntoDBS */

/**************************************************************************

*Function Name: UpdateColumnsInDBS()

*

*Args: 1. Table Name(IN).

* 2. Query string(IN).

*

*Returns: SUCCESS/FAILURE.

*

*Task: Updates a row in a given table.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

CHAR UpdateColumnsInDBS(CHAR* tName, CHAR* queryStr, INT32 queryStrLen)

{

RETCODE rc;

CHAR szStmt[SQL_QUERY_BUFF_SIZE];

INT32 i;

INT32 tempLen;

sprintf(szStmt, "update %s set ", tName);

tempLen = __Strlen(szStmt);

__Memcpy(szStmt + tempLen, queryStr, queryStrLen);

tempLen = tempLen + queryStrLen;

szStmt[tempLen] = '\0';

for (i = 0; i

{

DEBUGMSG2("%c", szStmt[i]);

}

DEBUGMSG1("\n");

rc = SQLAllocStmt(hDBC, &hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLPrepare(hStmt, szStmt, SQL_NTS);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLExecute(hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

if (hStmt)SQLFreeStmt(hStmt, SQL_DROP);

return SUCCESS;

}/* End of UpdateColumnsInDBS */

/**************************************************************************

*Function Name: DeleteRowFromDBS()

*

*Args: 1. Table Name(IN).

* 2. Query string(IN).

*

*Returns: SUCCESS/FAILURE.

*

*Task: Deletes a row in a given table.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

CHAR DeleteRowFromDBS(CHAR* queryStr, INT32 queryStrLen)

{

RETCODE rc;

INT32 i;

for (i = 0; i

DEBUGMSG2("%c", queryStr[i]);

DEBUGMSG1("\n");

rc = SQLAllocStmt(hDBC, &hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLPrepare(hStmt, queryStr, SQL_NTS);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

rc = SQLExecute(hStmt);

if (rc != SQL_SUCCESS)

{

PrintDBSError();

return FAILURE;

}

if (hStmt)SQLFreeStmt(hStmt, SQL_DROP);

return SUCCESS;

}

/**************************************************************************

*Function Name: FreeDBSResultPtr()

*

*Args: 1. References to be freed.

* 2. Number of references to be free.

* 3. References to be freed for length.

*

*Returns: Nothing.

*

*Task: Frees memory.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

void FreeDBSResultPtr(CHAR** ptr, INT32 cnt, U_LONG *ptrLen)

{

INT32 i;

for (i = 0; i

{

__Free(ptr[i]);

}

__Free(ptr);

__Free(ptrLen);

}

/**************************************************************************

*Function Name: PrintDBSError()

*

*Args: Nothing

*

*

*Returns: Nothing.

*

*Task: Prints error message.

*

*See Also:

*

*Docs: Yes.

*

*Bugs:

*****************************************************************************/

void PrintDBSError(void)

{

CHAR szState[6];

CHAR szMsg[255];

INT32 sdwNative;

INT16swMsgLen;

SQLError(hEnv, hDBC, hStmt, szState, &sdwNative,

szMsg, sizeof(szMsg), &swMsgLen);

DEBUGMSG3("%s\n%s\n", szState, szMsg);

}

#ifdef __cplusplus

}

#endif

/**************************************************************************

* End of odbc.c

**************************************************************************/CSDN源碼下載:http://download.csdn.net/detail/davebobo/9521546

總結

以上是生活随笔為你收集整理的mysql odbc c语言_C语言ODBC操作MySQL数据库(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

色偷偷人人澡久久超碰69 | 日韩中文在线播放 | 国产一二三精品 | 一区二区三区四区免费视频 | 一二三区在线 | 很黄很黄的网站免费的 | 麻豆高清免费国产一区 | 高清有码中文字幕 | 免费手机黄色网址 | 亚洲欧美综合精品久久成人 | 久久夜色精品国产欧美乱 | 欧美日韩综合在线观看 | 亚洲理论在线 | 麻豆传媒在线免费看 | 欧美一级黄大片 | 天天搞天天干 | 欧美91av | 精品理论片 | 欧美污污视频 | 日韩av在线高清 | a特级毛片 | 在线观看一级 | 久久一区二区免费视频 | 成人精品一区二区三区电影免费 | 亚洲视频,欧洲视频 | 在线观看亚洲国产 | 九九免费精品视频在线观看 | 日本韩国精品一区二区在线观看 | 狠狠色噜噜狠狠 | 国产天天综合 | 欧美美女视频在线观看 | 中文字幕乱码在线播放 | 337p日本大胆噜噜噜噜 | 在线视频成人 | 国产精品免费在线播放 | 96av视频| 国产日产精品一区二区三区四区的观看方式 | 开心激情综合网 | 日本黄区免费视频观看 | 精品国产亚洲日本 | 日日干精品 | 国产精品精品国产婷婷这里av | 毛片激情永久免费 | 在线 高清 中文字幕 | 国产一区二区午夜 | 精品一区在线看 | 国产成人高清av | 欧美一级免费高清 | 精品国产1区二区 | 五月婷婷在线视频观看 | 久操伊人| 精品不卡av | aaa日本高清在线播放免费观看 | 亚洲性少妇性猛交wwww乱大交 | 在线观看日韩专区 | 91成人免费 | 日韩大片免费在线观看 | 精品欧美乱码久久久久久 | www色,com| 丁香六月婷 | 天天操人人要 | 中文字幕成人在线 | 精品少妇一区二区三区在线 | 亚洲欧美视频在线 | 久久综合九色综合欧美就去吻 | 91精品国产综合久久婷婷香蕉 | 9草在线| 四虎成人网| 亚洲激情网站免费观看 | 日韩黄色免费电影 | 最新婷婷色 | 亚洲精品乱码久久久久 | av在线播放中文字幕 | 7777xxxx| 久草在线视频网 | 91久久久国产精品 | 日日草夜夜操 | 99精品国产aⅴ | 亚洲五月| 国产手机av在线 | 99爱国产精品 | 欧美一进一出抽搐大尺度视频 | 国产精品久久久久久久久久了 | 国产精品99蜜臀久久不卡二区 | 成人动漫一区二区三区 | 很黄很污的视频网站 | 色狠狠综合天天综合综合 | 国产精品观看在线亚洲人成网 | 久久不卡av | 国产日韩精品欧美 | 中国精品少妇 | av免费在线网 | 国产999视频在线观看 | 亚洲精品乱码久久久久久按摩 | 午夜神马福利 | 一区久久久 | 久久少妇| 国产免费av一区二区三区 | 视频国产在线 | 精品人妖videos欧美人妖 | 91网在线| 久久久久人人 | 国产精品视频不卡 | 精品久久久久久久久久国产 | 久久久久国产一区二区三区四区 | 人人讲 | 91看片淫黄大片91 | 国产视频日韩视频欧美视频 | 欧美综合干 | 国产成人亚洲精品自产在线 | 在线亚洲小视频 | 激情网站五月天 | 亚洲国产精彩中文乱码av | 美女免费黄视频网站 | 欧产日产国产69 | 91亚色免费视频 | 国产一级精品绿帽视频 | 91在线观看欧美日韩 | 999超碰| 99热日本 | 国产69久久 | 伊人天天| 亚洲午夜电影网 | 精品福利视频在线 | 久久精彩视频 | 免费观看一级特黄欧美大片 | 中文字幕乱偷在线 | 久久精品中文字幕一区二区三区 | 夜添久久精品亚洲国产精品 | 欧美性一级观看 | a在线免费 | 在线观看视频你懂的 | 久久久久久中文字幕 | 日本爱爱免费视频 | 免费人做人爱www的视 | 青青河边草免费观看完整版高清 | 国产黄色av网站 | 中文免费 | 国产一区在线免费观看 | 91看成人 | 午夜精品久久久99热福利 | 黄色成人免费电影 | 欧美一级在线观看视频 | 久久国产手机看片 | 国产精品普通话 | 亚洲资源在线观看 | 天天干天天操av | 国产成人亚洲在线观看 | 天天曰天天射 | 久色小说 | 亚洲精品中文在线资源 | 色无五月 | 人人舔人人干 | 黄色一二级片 | 狠狠色伊人亚洲综合网站野外 | 欧美日韩精品在线视频 | 日韩av成人在线观看 | 色之综合网 | 黄色在线网站噜噜噜 | 久章草在线观看 | 久久久久免费看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 天天插天天射 | 国产精品激情在线观看 | 精品人妖videos欧美人妖 | 国产成人精品久久 | 亚洲精品国产日韩 | 国产一区二区高清视频 | 日韩高清在线看 | 国产九色视频在线观看 | 国产高清黄 | 狠狠操狠狠干天天操 | 免费高清男女打扑克视频 | 亚洲欧美色婷婷 | 精品国产91亚洲一区二区三区www | 婷婷国产v亚洲v欧美久久 | 天天色天天综合网 | 中文字幕一区二区在线播放 | 成人av电影免费在线播放 | 国产成人久久久久 | 成人在线视频免费观看 | 久久成人毛片 | 一级特黄aaa大片在线观看 | 色综合激情网 | 99产精品成人啪免费网站 | 精品视频123区在线观看 | 蜜臀av一区二区 | av免费在线网站 | 色在线视频 | 国产在线不卡 | 九九免费精品视频在线观看 | 国产丝袜制服在线 | 激情婷婷久久 | 欧洲视频一区 | 亚洲最大av在线播放 | 精品av在线播放 | 在线观看久 | 久久精品2 | 欧美成人999 | 一区二区三区在线观看中文字幕 | 97视频亚洲 | 97超碰色| 毛片黄色一级 | 亚洲综合成人婷婷小说 | 欧美日韩在线精品一区二区 | 亚洲aⅴ久久精品 | 一区二区三区日韩视频在线观看 | 天天久久综合 | 日韩视频免费看 | 波多野结衣视频一区二区三区 | 国产精品在线看 | 国产在线中文 | 五月天色综合 | 最新色视频 | 国产精品一区专区欧美日韩 | 国内精品在线一区 | 成人免费视频a | 综合天天网 | 国产呻吟在线 | 成人黄色片在线播放 | 久久午夜精品影院一区 | 中文字幕亚洲高清 | 在线观看网站你懂的 | 欧美精品资源 | 91香蕉国产 | 欧美性天天| av高清在线观看 | 国产黄色在线网站 | 久久夜色精品国产欧美乱极品 | 亚洲欧洲一区二区在线观看 | 特级西西444www大精品视频免费看 | 欧美日韩在线观看一区二区三区 | 午夜美女福利 | 国产手机在线精品 | 美女性爽视频国产免费app | 精品欧美在线视频 | 久久精品网| 国产精品国产三级国产aⅴ无密码 | 在线精品在线 | 亚洲经典视频在线观看 | 亚洲精品视频国产 | 免费看的黄色网 | 精品99免费 | 亚洲欧美日本国产 | 国产黄色片一级 | 九九热国产视频 | 亚洲视频,欧洲视频 | 日日夜夜噜噜噜 | 亚洲欧洲av在线 | 日韩av免费一区二区 | 黄色软件大全网站 | 精品免费一区二区三区 | 亚洲高清视频在线观看 | 国产99在线免费 | 高清日韩一区二区 | 久久99视频免费观看 | 人人射人人射 | aa一级片 | 免费视频一区 | 欧美性生活免费看 | 国产精品女人网站 | 国产黄免费 | 一区二区三区免费 | 亚洲精品午夜国产va久久成人 | 99免费| 欧美特一级 | 午夜视频在线观看一区 | 99在线热播精品免费99热 | 午夜国产成人 | 69精品人人人人 | 日韩视频精品在线 | 日韩爱爱网站 | 国产精品第三页 | 久久艹综合 | 亚洲精品久久久久久国 | www国产亚洲精品久久麻豆 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 六月激情婷婷 | 首页国产精品 | 国产在线播放一区二区 | 日韩精品一区二区三区中文字幕 | 亚洲精品资源在线观看 | 欧美精品在线视频观看 | 国产精品午夜久久久久久99热 | 天堂在线一区二区 | 国产一区二区在线免费视频 | 亚洲蜜桃在线 | 91成人免费在线视频 | 亚洲日韩中文字幕在线播放 | 色综合激情网 | 337p日本欧洲亚洲大胆裸体艺术 | 亚洲综合少妇 | 五月婷婷一级片 | 国产精品18p | 六月丁香久久 | 国产精品女人久久久久久 | 91污在线观看 | 久草精品视频在线观看 | 玖玖在线免费视频 | 九色琪琪久久综合网天天 | 欧美精品久久久久性色 | www色com | 久久久久久久99 | 国产伦精品一区二区三区照片91 | 黄色在线观看免费网站 | 偷拍福利视频一区二区三区 | 久久狠狠婷婷 | 2019免费中文字幕 | 69成人在线 | 91网站在线视频 | 国产偷国产偷亚洲清高 | 高清av免费一区中文字幕 | 黄色资源在线 | 欧亚日韩精品一区二区在线 | 福利av在线| 免费观看日韩 | 免费黄色av电影 | 日韩电影在线观看一区二区三区 | 国产韩国精品一区二区三区 | 亚洲五月婷婷 | 视频1区2区 | 欧美日韩高清在线一区 | 日韩激情小视频 | 久久视频这里有久久精品视频11 | 天堂av网在线 | 97看片吧 | 国产精品一区二区果冻传媒 | 777奇米四色 | 精品久久免费看 | 探花视频在线观看+在线播放 | 久久在线电影 | 久久视频免费 | 欧美在线一二 | 日韩av影片在线观看 | 九九九九热精品免费视频点播观看 | 涩涩网站在线观看 | 日韩在线视频观看免费 | 一本一道久久a久久精品 | 狠狠干天天操 | 久久精品国产精品亚洲精品 | 五月天激情视频 | www.五月天婷婷.com | 在线观看av小说 | 在线看一区 | 国产资源在线观看 | 99国产情侣在线播放 | 久久在线影院 | 天天爱天天射天天干天天 | 蜜臀av一区二区 | 又黄又爽又刺激 | 91精品入口 | 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美最爽乱淫视频播放 | 色欧美综合 | 久久人人精 | v片在线看 | 色com| 欧美a级在线播放 | 中文字幕资源在线观看 | 超碰免费97 | 亚洲综合成人在线 | 日本中文字幕在线 | 免费影视大全推荐 | 在线免费观看一区二区三区 | 玖玖玖在线| 91av视频在线免费观看 | av中文国产 | 中文字幕在线观看一区二区 | 久久免费播放 | 久久久久国产精品免费免费搜索 | 天天爱天天操天天爽 | 色婷婷综合成人av | 一级黄色在线视频 | 97碰在线 | 黄色特级片 | 精品视频国产 | 激情欧美一区二区三区免费看 | 最近免费观看的电影完整版 | 国产一级视屏 | 日韩免费一区二区在线观看 | 久久精品国产亚洲精品 | 国产精品18videosex性欧美 | 成人av网站在线观看 | www.国产在线观看 | 999久久久 | 2021国产在线视频 | 成人av资源网站 | 日韩免费精品 | 96亚洲精品久久久蜜桃 | 97视频在线观看视频免费视频 | 91亚洲欧美| 国产精品免费观看久久 | 四虎8848免费高清在线观看 | 亚洲成aⅴ人片久久青草影院 | 绯色av一区 | 久久一级片 | 色黄www小说 | 成年人国产在线观看 | 日本激情视频中文字幕 | 色婷婷综合在线 | 国产99精品 | 天天干夜夜擦 | av怡红院 | 免费观看mv大片高清 | 国产精品久久久亚洲 | 91一区啪爱嗯打偷拍欧美 | 亚洲一区精品人人爽人人躁 | 黄色片亚洲| 免费在线观看一区二区三区 | 亚洲综合最新在线 | 精品久久久久亚洲 | 午夜精品久久久久99热app | 性色在线视频 | 久久综合久久八八 | 日韩欧美在线中文字幕 | 午夜av激情 | 天天色天天综合网 | www.com.日本一级 | 在线观看爱爱视频 | 成人va视频| 国产精品久久久久久爽爽爽 | 青青河边草手机免费 | 98福利在线| 91精品免费在线观看 | 国产成人a v电影 | 91视频久久久久久 | 伊人色综合久久天天 | 波多野结衣电影一区二区 | 涩涩在线 | 亚洲国产中文字幕 | 久久不见久久见免费影院 | 亚洲精品国产精品久久99热 | 免费a v视频| 国产乱码精品一区二区蜜臀 | 亚洲成人软件 | 日本九九视频 | 日韩欧美在线综合网 | 精品视频成人 | 天天干天天做天天操 | 成人av中文字幕在线观看 | 成人午夜剧场在线观看 | av九九九 | 视频福利在线 | 亚洲午夜精品久久久久久久久 | 国产精品一区在线观看你懂的 | 中文字幕在线高清 | 日本久草电影 | 丁香一区二区 | 在线观看一级 | 一区二区三区电影大全 | 狠狠色丁香久久综合网 | 精品黄色在线 | 日韩欧美视频免费看 | 国产精品久久久视频 | av大片免费| 亚洲一级在线观看 | 色姑娘综合 | 国产精品夜夜夜一区二区三区尤 | 伊人色综合久久天天网 | 免费在线一区二区三区 | 久草网免费 | 免费视频一二三区 | 99精品观看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 九九视频免费观看视频精品 | 黄色免费在线视频 | 激情欧美一区二区三区免费看 | 69精品在线 | 91av资源网| 超碰97久久 | 手机在线黄色网址 | 亚洲综合视频在线 | 久久久精品午夜 | 久久男人中文字幕资源站 | 国产精品免费成人 | 丁香网婷婷 | 免费在线视频一区二区 | 色综合天天综合 | 99综合视频| 欧美一区二区免费在线观看 | 在线观看视频国产 | 天天操天天干天天玩 | 51久久夜色精品国产麻豆 | 精品999在线观看 | 99热在线网站 | 天天激情综合 | 91精品一区二区三区蜜桃 | 久久字幕| 久久精品在线免费观看 | 亚洲午夜久久久久久久久 | 日本精品午夜 | 中文字幕在线观看第一区 | www.成人sex | 99超碰在线播放 | 精品久久久久久久久久久院品网 | 99欧美 | 国产视频97 | 久久国产精品一国产精品 | 美女网站在线观看 | 波多野结衣久久资源 | 一级片免费在线 | 看片网站黄色 | 久久久综合色 | 久久久久日本精品一区二区三区 | 91网页版在线观看 | 美女精品| 91精品国产福利在线观看 | 成人黄色在线视频 | 九九视频精品在线 | 最新av网址在线观看 | 很黄很污的视频网站 | 欧美在线一级片 | 五月婷婷一区 | 天堂网中文在线 | 深爱婷婷| 精品在线看 | 日韩最新中文字幕 | 免费看黄在线观看 | 午夜精品视频一区二区三区在线看 | 国产免费中文字幕 | 黄色网址在线播放 | 精品国产一区二区三区男人吃奶 | 国产一级在线免费观看 | 成人欧美亚洲 | 欧美激情视频一区二区三区 | 天天射天天射天天射 | 日韩在线三区 | 涩涩在线| 99热这里只有精品久久 | 美女国产网站 | 99久久婷婷国产一区二区三区 | 蜜桃视频日本 | 97电影网手机版 | 国产中文字幕国产 | 美女国内精品自产拍在线播放 | 91精品第一页 | 色综合天天综合 | 97av色| 国产日韩欧美视频 | 91在线中字 | 成人a视频 | 日韩电影在线视频 | 国产精品久久在线观看 | 亚洲精品综合一区二区 | 欧美日韩国产一区二区在线观看 | 久99久在线视频 | av电影在线不卡 | 亚洲国产中文在线观看 | 在线国产小视频 | 精品免费观看视频 | 免费观看视频黄 | 亚洲麻豆精品 | 国产在线色视频 | 欧美日韩免费观看一区=区三区 | 国产精品18久久久久久久网站 | 亚洲精品视频在线播放 | 成人性生活大片 | 手机看片福利 | 亚洲电影黄色 | 九九九视频在线 | 欧美一级看片 | 亚洲影视九九影院在线观看 | 国产成人三级 | 一区二区三区动漫 | 日韩城人在线 | 在线播放av网址 | 日本精a在线观看 | 丁香婷婷综合激情 | 天天搞夜夜骑 | 91豆花在线观看 | 久久少妇免费视频 | 最近中文字幕完整视频高清1 | 国产偷v国产偷∨精品视频 在线草 | 玖玖视频国产 | 久久综合狠狠 | 欧美一级片 | 91精品夜夜 | 久久精品国产亚洲aⅴ | 人人超碰97 | 国产裸体视频网站 | 91新人在线观看 | 黄色小网站在线 | 久久在线影院 | 日本精品视频在线观看 | 亚洲伦理精品 | 色爽网站 | 精品国产91亚洲一区二区三区www | 97国产在线播放 | 国产成人综合精品 | 国产成人福利 | 成人av免费 | 婷婷av网站 | 久久久久久久久久久久99 | 久久这里只有精品9 | 97超碰网 | 国产91精品欧美 | 综合国产视频 | 欧美日韩精品影院 | 免费91在线观看 | 最近中文字幕第一页 | 久久免费中文视频 | 久久999精品 | 最近免费中文视频 | 91精品国产99久久久久 | 96国产精品视频 | av成人免费在线观看 | 国产欧美日韩视频 | a天堂一码二码专区 | 日本xxxxav | 久久人人爽人人爽人人片av免费 | 国产精选在线观看 | 91精品久久久久久久久久入口 | 国产精品久久久久久一区二区 | 丁香五月缴情综合网 | 午夜精品久久久久久久99热影院 | 欧美亚洲国产一卡 | 成人av在线影院 | 91福利在线观看 | 国产精品九九久久99视频 | 98精品国产自产在线观看 | 久久国产露脸精品国产 | 午夜久草| 免费观看mv大片高清 | 亚洲高清在线 | japanesexxxxfreehd乱熟 | av黄色大片 | 国产人成精品一区二区三 | 亚洲天堂va | 国产福利免费看 | av在线短片 | www.com久久 | 丁香婷婷深情五月亚洲 | 成人黄在线观看 | 日韩欧美成人网 | 国产一级二级在线播放 | 四虎国产精品成人免费4hu | 超碰在线中文字幕 | 精品视频999 | 亚洲视频在线观看网站 | 国产精品女人久久久久久 | 黄色av免费看 | 午夜.dj高清免费观看视频 | 中文字幕有码在线观看 | 在线久草视频 | 日本久久91 | 91亚色视频| 亚洲国产精品99久久久久久久久 | 久久久黄色免费网站 | 国产精品破处视频 | 久久手机精品视频 | 黄网站免费大全入口 | 久久亚洲美女 | 999精品视频 | 精品中文字幕在线播放 | 婷婷色在线 | 免费影视大全推荐 | 国产综合激情 | 91av在线看| 5月丁香婷婷综合 | 狠狠色狠狠色合久久伊人 | 精品国产a | 亚洲成年人免费网站 | 综合激情网 | 中文字幕一区二区三区视频 | 色资源网免费观看视频 | 亚洲色图美腿丝袜 | 91桃色在线免费观看 | 国产精品久久久久久久久免费看 | 99看视频在线观看 | 亚色视频在线观看 | 91大神精品视频在线观看 | 天天曰夜夜爽 | 日本不卡一区二区三区在线观看 | 国产黄色片免费在线观看 | 天天躁天天狠天天透 | 日本激情中文字幕 | 狠狠色丁香婷婷综合久小说久 | 天天狠狠 | 亚洲视频免费在线看 | 色综合久久综合中文综合网 | 日韩欧美在线视频一区二区 | 亚洲欧美乱综合图片区小说区 | 国产亚洲精品xxoo | 中文字幕久久精品亚洲乱码 | 亚洲精品乱码久久久久 | 久久人人添人人爽添人人88v | 久久综合色天天久久综合图片 | 在线激情影院一区 | 日韩免费看| 欧美日韩在线视频免费 | 黄网站app在线观看免费视频 | 午夜精品成人一区二区三区 | 97超碰站| 狠狠色噜噜狠狠狠狠2022 | 日韩在线观看不卡 | 欧日韩在线视频 | 五月宗合网 | 一级免费片 | 国产特级毛片aaaaaa高清 | 69av在线播放 | 国产一区二区三区在线 | 久久久综合香蕉尹人综合网 | 波多野结衣在线观看视频 | 天堂成人在线 | 日韩美女一级片 | 久久99久久99精品免视看婷婷 | 色综合激情网 | 久久污视频 | 久久久久一区二区三区 | 日韩电影中文字幕 | 精品亚洲成人 | 亚洲高清视频一区二区三区 | 最近2019中文免费高清视频观看www99 | 亚洲视频在线播放 | 日韩av电影国产 | 日本少妇高清做爰视频 | 国产又粗又猛又黄又爽的视频 | 国产在线毛片 | 视频国产在线观看18 | 五月婷婷在线播放 | 黄色的视频网站 | 中文字幕在线播放日韩 | 丁香九月婷婷综合 | 色综合久久久 | 久久免费激情视频 | 国产最新福利 | www.色国产 | 免费日韩一区二区 | 色97在线| 久久女同性恋中文字幕 | 久久久久久久久久久久久久免费看 | 免费情趣视频 | 2021国产在线 | 国产91精品欧美 | 国产成人精品国内自产拍免费看 | 97超碰人人澡人人爱 | 久久综合久久综合九色 | 波多野结衣在线观看一区 | 成人免费观看完整版电影 | 丰满少妇麻豆av | 手机av在线免费观看 | 69精品久久 | 欧美在线观看小视频 | 在线观看中文字幕一区二区 | 亚洲精品在线资源 | 亚洲精品视频大全 | 91正在播放| 日日夜操 | 黄色的视频网站 | 久久综合欧美精品亚洲一区 | 黄色91在线| 亚洲三级网 | 国产高清不卡在线 | 天天操天天色天天射 | 黄p在线播放 | 中文字幕2021 | 中文字幕4 | 国产精品久久久久9999吃药 | 97成人在线免费视频 | 99久久婷婷国产精品综合 | 亚洲精品无 | 久久免费毛片视频 | 成人av免费在线 | 日韩在线观看小视频 | 97免费在线观看视频 | 国产美女主播精品一区二区三区 | 成人在线视频免费观看 | 中文字幕刺激在线 | 日韩色在线 | 免费av在 | 国产综合精品久久 | 国产超碰97 | av色综合 | 又黄又色又爽 | 天天天天爱天天躁 | 欧美激情xxxx| 四虎在线免费观看 | av免费片 | 国产精品国产三级国产不产一地 | 国产精品久久久久久影院 | 国产99久久久国产精品 | 欧美爽爽爽| 成人蜜桃视频 | 99久久精品费精品 | 日本xxxxav| 丁香六月欧美 | av免费在线观看网站 | 99精品久久精品一区二区 | 一区二区三区在线视频111 | 97在线看 | 国产精品私拍 | 久热爱 | 国产不卡在线观看视频 | 成人少妇影院yyyy | 久久久精品久久日韩一区综合 | 欧美精品久久久久久久 | 国产精品自产拍在线观看网站 | 亚洲精品1区2区3区 超碰成人网 | 91一区一区三区 | 蜜桃av观看| 日韩精品视频免费专区在线播放 | 欧美一级性 | 蜜桃视频成人在线观看 | 国产精品18久久久久久久网站 | 国产精品va在线播放 | 欧美日韩国产成人 | 久久成人高清视频 | 国产在线一区观看 | 天天躁日日躁狠狠躁av麻豆 | 日本久久成人中文字幕电影 | 久久久久免费精品国产 | 国产日韩欧美网站 | 欧美亚洲精品一区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲经典视频在线观看 | 色欧美成人精品a∨在线观看 | 久久国产综合视频 | 999久久久久久久久久久 | 国产精久久久久久久 | 日日干视频 | 天堂成人在线 | 六月色婷 | 免费观看的黄色 | 久久这里只精品 | 视频二区在线 | 欧美整片sss | 欧美黑吊大战白妞欧美 | 国产免费又爽又刺激在线观看 | 免费在线国产视频 | 521色香蕉网站在线观看 | 亚洲在线视频免费观看 | 欧美久久久一区二区三区 | 九九热国产视频 | 色国产精品 | 六月久久婷婷 | 久久久精品国产免费观看同学 | 国产精品高清免费在线观看 | 在线观看中文字幕亚洲 | 国产精品一区二区果冻传媒 | 久久亚洲欧美日韩精品专区 | 亚洲成人国产精品 | 成人免费网视频 | 91黄色免费网站 | 黄色av网站在线免费观看 | www.色午夜,com | 精品国产伦一区二区三区观看体验 | 亚洲精品在线看 | 日本韩国在线不卡 | 精品一二三区视频 | 日本高清久久久 | 亚洲三级黄 | 97精品视频在线播放 | 91黄色在线视频 | 久久久久久久久久久国产精品 | 97国产视频| 久久96国产精品久久99软件 | 国产福利91精品一区二区三区 | 国产精品久久久久久久久久不蜜月 | 国产精品日韩精品 | 国产精品伦一区二区三区视频 | 亚洲影视九九影院在线观看 | 欧美经典久久 | 九九热只有精品 | 综合亚洲视频 | 在线观看黄色的网站 | 永久免费毛片在线观看 | 亚洲免费视频在线观看 | 最新av免费在线 | 免费av的网站 | 一区 二区电影免费在线观看 | 成人丁香花 | 不卡视频在线看 | 午夜精品久久 | 在线观看www视频 | 日日夜夜中文字幕 | 午夜视频二区 | 精品久久久久国产 | 国内精品久久久久影院一蜜桃 | 狠狠色噜噜狠狠狠合久 | 国产在线观看污片 | 精品一区二区三区在线播放 | 日本精品xxxx | 婷婷久久一区 | 中文字幕123区 | 免费在线观看av网址 | 91人网站| 色综合小说 | 91热在线 | 国产成人精品999在线观看 | 亚洲精品在线看 | 亚洲国产中文字幕在线观看 | 一区二区影视 | 久久9999久久免费精品国产 | 精品亚洲视频在线观看 | 国产精品网站一区二区三区 | 激情黄色一级片 | 欧美日韩伦理一区 | 午夜精品成人一区二区三区 | 三级a视频 | 日韩av成人在线观看 | 国产精品青草综合久久久久99 | 久久久久久久免费 | 美女精品在线观看 | 九九欧美视频 | 91精品国产麻豆国产自产影视 | 亚洲国产成人av网 | 97看片网| 99九九99九九九视频精品 | 国产啊v在线 | 免费视频成人 | 国产成人精品久久久久蜜臀 | 亚洲国产精品久久久 | 日韩理论在线 | 婷婷五月色综合 | 中文在线8资源库 | 国产在线观看污片 | 日韩欧美高清一区二区 | 免费看黄在线网站 | 国内三级在线观看 | 国产不卡在线 | 久久在线观看 | 激情欧美丁香 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 亚洲精品18日本一区app | 久99久精品视频免费观看 | 97韩国电影 | 一区二区视频欧美 | 国产精品免费在线 | 久久精品国产精品 | 色婷婷播放 | 成人va在线观看 | 婷婷5月激情5月 | 少妇精品久久久一区二区免费 | 99视频免费看| 国产流白浆高潮在线观看 | 欧美在线你懂的 | 欧美另类美少妇69xxxx | 久久成人黄色 | 色综合天天综合网国产成人网 | 久久精品视频一 | 国产成人精品一区二区在线 | 久久精品毛片 | 视频国产在线观看18 | 久久精品96| 99热99re6国产在线播放 | 亚洲国产日韩一区 | 精品一区二区综合 | 亚洲欧美成人综合 | 免费电影播放 | 九九热视频在线免费观看 | 五月婷婷久 | 中国精品一区二区 | 91看成人| 日韩国产精品久久久久久亚洲 | 成人久久网| 久久影院中文字幕 | 91丨九色丨国产在线观看 | 日韩色区| 亚洲欧美日韩国产精品一区午夜 | 国产亚洲精品久久网站 | 成人一级黄色片 | 亚洲区精品视频 | 日韩高清一 | 国产v在线观看 | 日韩精品欧美一区 | 五月天久久精品 | 一级片观看 | 黄色成人91 | 激情丁香久久 | 日韩av一区二区在线影视 | 免费三级av | 中文免费观看 | 久久综合爱 | 99草在线视频 | 亚洲欧美日韩精品久久久 | 日韩中文字幕免费 | 日韩在线观看视频在线 | 97成人在线 | 九九久久电影 | 国产69精品久久久久久久久久 | 日韩视频免费观看高清 | 美女久久视频 | 日本精品久久久久中文字幕 | 毛片网在线播放 | 五月综合 | 911久久香蕉国产线看观看 | 久久精品网站视频 | 日韩国产精品久久久久久亚洲 | 久久精品国产v日韩v亚洲 | 一区久久久 | 在线a视频免费观看 | 久久视频这里只有精品 | 99久久精品国产一区二区三区 | 97视频人人| 狠狠色狠狠色综合日日小说 | 免费国产ww | 96精品视频 | 日韩精品一区二区三区丰满 |