亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? myodbc.cpp

?? 使用數據庫的VC編程實現
?? CPP
字號:
// Odbc1.cpp: implementation of the CMyODBC class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyODBC.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#pragma comment(lib, "ODBC32")

CMyODBC::CMyODBC()
{
	this->m_hdbc = NULL;
	this->m_henv = NULL;
	this->m_hstmt = NULL;
	this->m_retcode = 0;
	m_pSet = NULL;

}

CMyODBC::~CMyODBC()
{
	DisConnect();
	
}

BOOL CMyODBC::ConnectDB(const char *cpServerName,const char *cpUserName,const char *cpPassword)
{
	//分配環境句柄
	m_retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_henv);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		AfxMessageBox("分配環境句柄失敗!");
		return FALSE;
	}
		/* Set the ODBC version environment attribute */
	m_retcode = SQLSetEnvAttr(m_henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_henv, SQL_HANDLE_ENV, "設置odbc版本號時失敗!");
		return FALSE;
	}	
	/*分配連接句柄 */
	m_retcode = SQLAllocHandle(SQL_HANDLE_DBC, m_henv, &m_hdbc); 
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_henv, SQL_HANDLE_ENV,"分配連接句柄失敗!");
		return FALSE;
	}

	/* 連接數據庫 */
	m_retcode = SQLConnect(m_hdbc, (SQLCHAR*) cpServerName, SQL_NTS, (SQLCHAR*) cpUserName, SQL_NTS, (SQLCHAR*) cpPassword, SQL_NTS);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"連接數據庫失敗!");
		return FALSE;
	}
	return TRUE;
}

			

BOOL CMyODBC::ExeSqlDirect(const char *cpSqlStmt)
{
	SQLHSTMT hStmt;
	if(this->m_hdbc == NULL)
	{
		AfxMessageBox("沒有連接數據庫,請先進行聯接!");
		return FALSE;
	}

	m_retcode = SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &hStmt); 
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"分配語句句柄失敗,不能執行");
		return FALSE;
	}

	m_retcode = SQLExecDirect(hStmt, (unsigned char *)cpSqlStmt, SQL_NTS);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO) && (m_retcode != SQL_NO_DATA))
	{
		ReportError(hStmt, SQL_HANDLE_STMT, "執行sql語句失敗,不能執行");
		SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
		hStmt = NULL;
		return FALSE;
	}

	SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
	hStmt = NULL;
	return TRUE;
}

BOOL CMyODBC::DisConnect()
{
	if(m_hstmt != NULL)
	{
		SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
		m_hstmt = NULL;
	}

	if(this->m_hdbc != NULL)
	{
		SQLDisconnect(m_hdbc);
		SQLFreeHandle(SQL_HANDLE_DBC, m_hdbc);
		m_hdbc = NULL;
	}
	
	if(this->m_henv != NULL)
	{
		SQLFreeHandle(SQL_HANDLE_ENV, m_henv);
		m_henv = NULL;
	}

	if(this->m_pSet != NULL)
	{
		m_pSet = NULL;
	}
	return TRUE;

}

BOOL CMyODBC::PrepareSql(const char *cpSql, CODBCSet &rset)
{
	CString strWarn,  strError;;
	if(this->m_hstmt != NULL)
	{
		SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
		m_hstmt = NULL;
	}

	if(this->m_hdbc == NULL)
	{
		AfxMessageBox("沒有連接數據庫,請先進行聯接!");
		return FALSE;
	}

	m_retcode = SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &m_hstmt); 
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"分配語句句柄失敗,不能執行");
		return FALSE;
	}

	this->m_pSet = &rset;
	if(!m_pSet->IsEmpty())
	{
		m_pSet->Empty();
	}

	m_retcode = SQLExecDirect(m_hstmt, (unsigned char *)cpSql, SQL_NTS);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hstmt,SQL_HANDLE_STMT, "執行sql語句失敗");
		SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
		m_hstmt = NULL;
		return FALSE;
	}
	
	SQLSMALLINT iNumCols = 0;
	m_retcode = SQLNumResultCols(m_hstmt, &iNumCols); 
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hstmt,SQL_HANDLE_STMT,  "取列數失敗,不能執行");
		return FALSE;
	}
	m_pSet->m_cols = iNumCols;
	m_pSet->m_coldata = new COL_DATA_ODBC[iNumCols];
	if (m_pSet->m_coldata == NULL) 
	{
		AfxMessageBox("分配每個列內存空間失敗\n");
		return FALSE;
	}

	m_pSet->m_coldatafmt  = new COL_DATAFMT_ODBC[iNumCols];
	if(m_pSet->m_coldatafmt == NULL)
	{
		AfxMessageBox("分配每個列信息的內存空間失敗\n");
		delete []m_pSet->m_coldata;
		m_pSet->m_coldata = 0;
		return FALSE;
	}

	SQLINTEGER    dataLen;
	SQLSMALLINT  SqlType, cType;   
	char   SqlColName[100];
	SQLSMALLINT StringLeng;
	SqlType = SQL_INTEGER ;

	for(int iCount = 0; iCount <iNumCols; iCount++)
	{
		m_retcode = SQLColAttribute(m_hstmt, ((SQLUSMALLINT)iCount) + 1, SQL_DESC_NAME, (SQLPOINTER)SqlColName, 100, &StringLeng, 0);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			ReportError(m_hstmt,SQL_HANDLE_STMT,"取列名時失敗");
			return FALSE;
		}
		strncpy(m_pSet->m_coldatafmt[iCount].name, SqlColName, StringLeng);
		m_pSet->m_coldatafmt[iCount].name[StringLeng] = 0;

		m_retcode = SQLColAttribute(m_hstmt, ((SQLUSMALLINT)iCount) + 1, SQL_DESC_TYPE, NULL, 0, NULL, (SQLPOINTER)&SqlType);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			ReportError(m_hstmt,SQL_HANDLE_STMT,"取類型代碼時失敗");
			return FALSE;
		}
		cType = GetDefaultCType(SqlType);
		m_pSet->m_coldatafmt[iCount].datatype = cType;
		dataLen = GetColLength(m_hstmt, SqlType,iCount+1)  ;
		m_pSet->m_coldatafmt[iCount].maxlength = dataLen + 1;
		
		m_pSet->m_coldata[iCount].valuelen = new long;
		m_pSet->m_coldata[iCount].value = new char[dataLen+1];

		if( m_pSet->m_coldata[iCount].value == NULL ||  m_pSet->m_coldata[iCount].valuelen == NULL) 
		{
			AfxMessageBox("fail: new char[]");
			delete m_pSet->m_coldata[iCount].value;
			delete m_pSet->m_coldata[iCount].valuelen;
			delete m_pSet->m_coldata;
			delete m_pSet->m_coldatafmt;
			m_pSet->m_coldata = 0;
			m_pSet->m_coldatafmt = 0;
			return FALSE;
		}
		memset(m_pSet->m_coldata[iCount].value, 0, dataLen+1);
	}
		//bind
	// 
	for(int i = 0; i < iNumCols; i++)
	{
		m_retcode = SQLBindCol(m_hstmt, ((SQLUSMALLINT)i)+1,(SQLSMALLINT)m_pSet->m_coldatafmt[i].datatype ,m_pSet->m_coldata[i].value, m_pSet->m_coldatafmt[i].maxlength, (long *)m_pSet->m_coldata[i].valuelen);

		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			strError.Format("第 %d 列綁定失敗,你指定的類型是%d",i + 1, m_pSet->m_coldatafmt[i].datatype);
			ReportError(m_hstmt,SQL_HANDLE_STMT, strError);
			return FALSE;
		}
	}

	return TRUE;
}





BOOL CMyODBC::FetchData()
{
	if((m_retcode = SQLFetch(m_hstmt)) != SQL_NO_DATA)
	{
		ConvertDataToChar();
		return TRUE;
		
	}
	else
	{
		if(m_hstmt != NULL)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
			m_hstmt = NULL;
		}
		return FALSE;
	}

}

//iColumnIndex用來表示列的序號,從1開始計數
SQLSMALLINT   CMyODBC::GetDefaultCType(long iODBCType)
{
	CString strWarn;
	SQLSMALLINT      iResult;
	switch(iODBCType)
	{
	case SQL_VARCHAR:
	case SQL_CHAR:
	case SQL_DECIMAL:
	case SQL_NUMERIC:
	case SQL_DOUBLE:
	case SQL_SMALLINT:
	case SQL_INTEGER:
	case SQL_FLOAT:
	case SQL_REAL:     
		iResult = SQL_C_CHAR; 
		break;
	case SQL_DATETIME:
		iResult = SQL_C_TYPE_TIMESTAMP;
		break;
	default:
		strWarn.Format("不支持這種轉換--%d", iODBCType);
		AfxMessageBox(strWarn);
		iResult = -1;
		break;
	}
	return iResult;

}

long CMyODBC::GetColLength(SQLHSTMT &hstmt,int iDataType, int iCol)
{
	long lTemp = 0, lResult = -1;
	switch(iDataType)
	{

	case SQL_CHAR:
	case SQL_VARCHAR:
		m_retcode = SQLColAttribute(hstmt, (SQLUSMALLINT)iCol, SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, (SQLPOINTER)&lResult);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			AfxMessageBox("取列長度時失敗");
			return FALSE;
		}
		break;
	case SQL_NUMERIC:
	case SQL_DECIMAL:
	case SQL_DOUBLE:
	case SQL_SMALLINT:
	case SQL_INTEGER:
	case SQL_FLOAT:
	case SQL_REAL:    
		m_retcode = SQLColAttribute(hstmt, (SQLUSMALLINT)iCol, SQL_DESC_PRECISION, NULL, 0, NULL, (SQLPOINTER)&lResult);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			AfxMessageBox("取列整數部分的長度時失敗");
			return FALSE;
		}

		m_retcode = SQLColAttribute(hstmt, (SQLUSMALLINT)iCol, SQL_DESC_SCALE, NULL, 0, NULL, (SQLPOINTER)&lTemp);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			AfxMessageBox("取列小數長度時失敗");
			return FALSE;
		}
		lResult += lTemp ;
		break;

	case SQL_DATETIME:
		m_retcode = SQLColAttribute(hstmt, (SQLUSMALLINT)iCol, SQL_DESC_PRECISION, NULL, 0, NULL, (SQLPOINTER)&lResult);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			AfxMessageBox("取列整數部分的長度時失敗");
			return FALSE;
		}

		m_retcode = SQLColAttribute(hstmt, (SQLUSMALLINT)iCol, SQL_DESC_SCALE, NULL, 0, NULL, (SQLPOINTER)&lTemp);
		if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
		{
			AfxMessageBox("取列小數長度時失敗");
			return FALSE;
		}
		lResult += lTemp + 1;
		break;

		default:
			AfxMessageBox("不支持這種類型");
			break;
	}

	return lResult ;

}

void CMyODBC::ReportError(SQLHSTMT &hstmt, int iHandleType ,CString strAlert)
{
	
	unsigned char *SQLState = new unsigned char[6];
	if(SQLState == NULL)
	{
		AfxMessageBox("報告發生錯誤的原因時,分配sqlstat內存失敗");
		return;
	}
	char Message[500] = "\0";
	short iMesLen;
	CString strError;
	SQLGetDiagRec(iHandleType, hstmt, 1, SQLState, NULL, (unsigned char  *)Message, 500, &iMesLen);
	strError.Format("%s,%s" , strAlert, Message);
	AfxMessageBox(strError);
	delete SQLState; SQLState= NULL;
}



int CMyODBC::ConvertDataToChar()
{
	int i;
	TIMESTAMP_STRUCT timeStamp;

	for(i = 0; i < m_pSet->GetCols(); i++)
	{
		if(*(m_pSet->m_coldata[i].valuelen) == -1)//處理的值為空
		{
			memset(m_pSet->m_coldata[i].value, 0, m_pSet->m_coldatafmt[i].maxlength);
			*(m_pSet->m_coldata[i].valuelen) = m_pSet->m_coldatafmt[i].maxlength - 1;
			continue;
		}
		
		switch (m_pSet->m_coldatafmt[i].datatype)
		{
		case SQL_C_CHAR:
			break;

		case SQL_C_TYPE_TIMESTAMP:
			timeStamp.year = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->year;
			timeStamp.month = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->month;
			timeStamp.day = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->day;
			timeStamp.hour = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->hour;
			timeStamp.minute = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->minute;
			timeStamp.second = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->second;
			timeStamp.fraction = ((TIMESTAMP_STRUCT *)m_pSet->m_coldata[i].value)->fraction;
			sprintf(m_pSet->m_coldata[i].value, "%4u-%2u-%2u %2u:%2u:%2u", timeStamp.year, timeStamp.month, timeStamp.day, timeStamp.hour, timeStamp.minute, timeStamp.second);
			*(m_pSet->m_coldata[i].valuelen) = 19;
			break;
		default:
			AfxMessageBox("還沒有支持這種數據類型的轉換");
			return -1;
		}
	}
	return 0;
		

}

int CMyODBC::ExecTrans(CStringList &strSqlList)
{
	POSITION pos;
	CString strSql;
	BOOL bStatus;
	int iReturn = 0;
	if(m_hdbc == NULL)
	{
		AfxMessageBox("連接句柄為空,不能執行");
		return -1;
	}
	//設置提交方式為手動
	m_retcode = ::SQLSetConnectOption(m_hdbc, SQL_AUTOCOMMIT,	SQL_AUTOCOMMIT_OFF);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"設置手動提交方式失敗");
		return -1;
	}
	
	//執行sql
	for(pos = strSqlList.GetHeadPosition(); pos != NULL;)
	{
		strSql = strSqlList.GetNext(pos);
		bStatus = this->ExeSqlDirect(strSql); 
		if(bStatus == FALSE)//執行失敗,回滾
		{
			m_retcode = ::SQLEndTran(SQL_HANDLE_DBC, m_hdbc, SQL_ROLLBACK);
			if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
			{
				ReportError(m_hdbc, SQL_HANDLE_DBC,"執行事務失敗,并且回滾失敗");
			}
			iReturn = -1;
			goto RESET_AUTO_COMMIT;
		}
	}
	//提交
	m_retcode = ::SQLEndTran(SQL_HANDLE_DBC, m_hdbc, SQL_COMMIT);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"執行事務完成后,提交失敗");
		iReturn = -1;
	}
	//再把提交方式設為自動
RESET_AUTO_COMMIT:
	m_retcode = ::SQLSetConnectOption(m_hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON);
	if ((m_retcode != SQL_SUCCESS) && (m_retcode != SQL_SUCCESS_WITH_INFO))
	{
		ReportError(m_hdbc, SQL_HANDLE_DBC,"設置自動提交方式失敗");
		iReturn = -1;
	}

	return iReturn;

}

//下面的這個不能檢查到數據庫是否已經關了。

BOOL CMyODBC::IsOpen()
{
	if(this->m_henv == NULL)
	{
		return FALSE;
	}

	if(this->m_hdbc == NULL)
	{
		return FALSE;
	}
	return TRUE;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合色噜噜狠狠| 欧美性猛交xxxx乱大交退制版| 亚洲自拍与偷拍| 午夜精品一区在线观看| 1000部国产精品成人观看| 精品va天堂亚洲国产| 日韩三级视频在线看| 欧美日韩成人综合在线一区二区| 91高清视频在线| 色婷婷av久久久久久久| 色悠悠亚洲一区二区| 色婷婷综合久久| 欧洲生活片亚洲生活在线观看| 成人av在线看| 9人人澡人人爽人人精品| av激情综合网| 91视频xxxx| 欧美午夜精品久久久久久孕妇| 欧美亚洲高清一区| 欧美日韩一区久久| 在线观看国产一区二区| 欧美三级电影在线看| 欧美日韩电影在线| 日韩精品在线看片z| 久久影院午夜论| 国产精品久久久久久久久免费相片| 日本一区二区成人| 亚洲女同女同女同女同女同69| 国产精品久久久久久户外露出| 亚洲美女在线一区| 日韩在线a电影| 国产在线一区二区| av不卡在线播放| 欧美精品高清视频| 久久综合九色综合97婷婷女人| 欧美高清在线精品一区| 亚洲永久精品国产| 久久99精品久久久久久动态图| 国产成人av影院| 在线亚洲+欧美+日本专区| 欧美精品一级二级三级| 久久久久高清精品| 亚洲特黄一级片| 蜜桃av噜噜一区| 成人黄色在线视频| 777亚洲妇女| 国产欧美日韩综合精品一区二区| 亚洲日本欧美天堂| 麻豆91在线观看| 色综合久久天天| 久久一日本道色综合| 亚洲国产综合视频在线观看| 国产剧情一区二区| 69成人精品免费视频| 中文字幕在线一区免费| 男女男精品网站| 色哟哟在线观看一区二区三区| 久久久电影一区二区三区| 亚洲毛片av在线| 成人网在线免费视频| 日韩欧美在线一区二区三区| 一区二区中文视频| 日本强好片久久久久久aaa| 99视频有精品| 国产精品久久三区| 黑人巨大精品欧美黑白配亚洲| 欧洲一区在线电影| 国产精品久久久久久久久免费丝袜| 蜜臀99久久精品久久久久久软件| 欧美亚洲愉拍一区二区| 久久亚洲一区二区三区四区| 亚洲精品国产精华液| 成人91在线观看| 欧美经典三级视频一区二区三区| 美女视频黄 久久| 3d成人h动漫网站入口| 亚洲综合一二区| 欧美三级三级三级爽爽爽| 亚洲视频一二区| 91在线观看下载| 综合中文字幕亚洲| caoporm超碰国产精品| 中文字幕精品三区| 成人黄色av电影| 国产精品青草久久| 国产成人精品网址| 国产精品美女视频| 99久久婷婷国产综合精品电影| 国产精品久久久久影院| 成人高清免费观看| 中文字幕一区在线| 91免费看`日韩一区二区| 中文字幕一区二| 日本伦理一区二区| 亚洲成av人片在www色猫咪| 欧美午夜一区二区三区免费大片| 亚洲综合色网站| 69堂国产成人免费视频| 精品午夜一区二区三区在线观看| 久久久青草青青国产亚洲免观| 国产原创一区二区| 中文字幕日韩av资源站| 欧美在线短视频| 免费视频最近日韩| 国产欧美日韩中文久久| 91色porny蝌蚪| 日本成人中文字幕在线视频| 久久综合九色综合欧美亚洲| 99re热这里只有精品免费视频| 亚洲欧美日韩国产手机在线| 欧美电影影音先锋| 国产一区二区三区免费播放| 尤物视频一区二区| 日韩一区二区中文字幕| 成人av网站免费观看| 亚洲福利视频一区| 久久久久久久久久久久久夜| 色综合夜色一区| 韩国女主播一区二区三区| |精品福利一区二区三区| 日韩一区二区免费在线电影 | 国产不卡在线播放| 亚洲色图20p| 日韩欧美电影一二三| 99精品国产一区二区三区不卡| 图片区日韩欧美亚洲| 国产日产欧美一区二区三区| 欧美日韩国产综合久久| 高清日韩电视剧大全免费| 亚洲成a人在线观看| 久久久国产综合精品女国产盗摄| 欧美色图12p| 成人精品在线视频观看| 蜜桃免费网站一区二区三区| 亚洲欧美日韩综合aⅴ视频| 精品国产一区二区在线观看| 欧美性受极品xxxx喷水| 国产成人精品免费看| 久久99精品国产麻豆婷婷| 亚洲专区一二三| 国产精品白丝在线| 久久久久久久网| 欧美一区二区三区成人| 日本久久精品电影| 91视频你懂的| 不卡高清视频专区| 国产精品一二三在| 美女www一区二区| 午夜久久电影网| 亚洲成在人线免费| 午夜国产精品一区| 亚洲成av人片一区二区| 一区二区成人在线观看| 《视频一区视频二区| 欧美高清在线一区| 中文一区一区三区高中清不卡| 久久综合色综合88| 国产亚洲精品久| 久久久精品国产免大香伊| 久久精品亚洲麻豆av一区二区 | 欧美精品亚洲二区| 在线亚洲一区二区| 一本久久a久久精品亚洲| 99视频超级精品| 不卡av在线网| 93久久精品日日躁夜夜躁欧美| 99久久精品国产精品久久| 成人av在线影院| 91免费在线看| 欧美在线你懂的| 欧美理论电影在线| 精品少妇一区二区三区免费观看| 日韩亚洲欧美成人一区| 欧美成人艳星乳罩| 国产三级欧美三级| 国产精品家庭影院| 亚洲一二三区在线观看| 亚洲国产综合人成综合网站| 美国一区二区三区在线播放| 久久精品国产澳门| 国产精选一区二区三区| 成人午夜在线播放| 色综合天天综合狠狠| 欧美日韩一区不卡| 精品国产免费久久| 国产精品毛片a∨一区二区三区| 国产精品美女久久久久av爽李琼| 一区二区三区在线播放| 麻豆精品新av中文字幕| 国产另类ts人妖一区二区| 色又黄又爽网站www久久| 欧美美女喷水视频| 久久久久久久久久美女| 亚洲精品日韩综合观看成人91| 日韩成人精品在线观看| 精久久久久久久久久久| 色哟哟日韩精品| 欧美精品一区在线观看| 一区二区三区av电影 | 蜜桃视频一区二区三区在线观看|