国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

一個用技巧強大的ODBC API 函數訪問數據庫類

一個用技巧強大的ODBC API 函數訪問數據庫類

更新時間:2021-09-25 文章作者:未知 信息來源:網絡 閱讀次數:

/*-- 專項技術學習 -數據庫訪問技術之ODBC API                 
     這個類 通過ODBC API 函數訪問ODBC 數據源的數據表            
     功能簡介:能夠幫定一個臨時指定表,調用類的函數即可對該表    
     插入、增加、修改、簡單統計等等操作(注:通過動態改變表的信息:表名字、
  表字段總數、字段名字、字段類型、字段是否為數值、字段是否為主鍵。這樣
  就可以訪問ODBC 數據源的所有表了)                          
     另外提供一個函數 可以對該數據源的其他表(包括幫定的表)進行 
     刪除、修改功能                                               
     LSZ 2001.08.25                                                  */

/*頭文件*/

#ifndef _WDC_DATABASE_H
#define _WDC_DATABASE_H

#include <sql.h>
#include <sqlext.h>

#define  MAX_FIELDS     500
#define  MAX_ERROR_MSG  1024
#define  MAX_DATA     500

class CWdcDatabase  
{
public:
CWdcDatabase();
virtual ~CWdcDatabase();
    BOOL Open(const CString& sDSN,
     const CString& sTable,
     const CString& sUserId,
     const CString& sPassword)  ; /*打開一個ODBC數據源數據庫*/

public:
BOOL m_bOpen;  /*標志數據庫是否打開*/
BOOL m_bBrackets; /*標識表名、字段名是否用方擴號擴起來*/
int m_nError;  /*ODBC錯誤返回代碼*/
CString m_sQuery; /*操作ODBC 數據源公用的語句,用于方便構造*/
CString m_sErrMsg; /*ODBC錯誤返回信息*/
CString m_sDSN;  /*ODBC 數據源的 DSN*/
CString m_sTable;   /*臨時綁定的表名*/

public:
void DropHstmtSelect(); /*確保公共查詢的語句句柄釋放*/
long GetRecordCount(CString &sSel); /*取得符合條件的記錄數*/
BOOL NextMatchingRecord(); /*查詢符合條件的下一條記錄*/
int SelectMatchingRecords(CString& sWhereContext); /*查詢符合條件的記錄*/
BOOL UpdateRecord(); /*更新臨時綁定的表的一條記錄*/
BOOL AddRecord();    /*增加臨時綁定表一條新記錄*/
BOOL DeleteRecord(CString &sWhereDelete); /*刪除臨時綁定表符合條件記錄*/
BOOL Execute(const CString  &sText); /*執行一個SQL語句,注:可以執行存儲過程*/
void Close();        /*關閉數據庫*/
public:
int m_nFields;       /*臨時綁定表字段的總數*/
CString m_sFieldName[MAX_FIELDS]; /*臨時綁定表字段名字*/
CString m_sFieldValue[MAX_FIELDS];/*臨時綁定表字段值*/
BOOL m_bKeyField[MAX_FIELDS];/*臨時綁定表字段是否為主鍵*/
BOOL m_bNumeric[MAX_FIELDS];/*臨時綁定表字段是否為數值類型*/

private:
CString Quote(CString &sQuote); /*字符串替換*/
RETCODE rc;                     /*ODBC API 涵數執行返回碼*/
HSTMT hstmt, hstmt_select; /*公共語句句柄*/
unsigned char szDSN[200]; /*連接數據源的 DSN */
unsigned char szID[200]; /*連接數據源的 UID */
unsigned char szPassword[200]; /*連接數據源的 PWD*/
unsigned char szQuery[3000]; /*公共執行的語句句柄*/
unsigned char szTemp[1000]; /*公共使用的字符串*/
CString sTemp ; /*公共使用的字符串*/
HENV henv;      /*環境句柄*/
HDBC hdbc;      /*ODBC 連接句柄*/
};

#endif


/*實現文件*/

#include "stdafx.h"
#include "WdcDatabase.h"
#include <sql.h>
#include <sqlext.h>

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

CWdcDatabase::CWdcDatabase()
{
  m_nError = 0;
m_bOpen = false;
m_nFields = 0;
m_bBrackets = false;
}

CWdcDatabase::~CWdcDatabase()
{
    if(m_bOpen)
{
  Close() ;
}
}

BOOL CWdcDatabase::Open(const CString& sDSN,
      const CString& sTable,
      const CString& sUserId,
      const CString& sPassword)
{
    if(m_bOpen)
{
  Close() ;
}

hstmt_select = NULL ;
RETCODE rc ;
CString stemp ;

memset(szDSN,0x00,200) ;
    memset(szID,0x00,200) ;
memset(szPassword,0x00,200) ;
/*Open Database */
SQLAllocEnv(&henv) ;
SQLAllocConnect(henv,&hdbc) ;

strcpy((char*)szDSN,sDSN) ;

stemp = sUserId ;
strcpy((char*)szID,stemp) ;

    stemp = sPassword ;
strcpy((char*)szPassword,stemp) ;

m_sDSN   = sDSN ;
m_sTable = sTable ;

rc = SQLConnect(hdbc,
     szDSN,
     SQL_NTS,
     szID,
     SQL_NTS,
     szPassword,
     SQL_NTS);

m_nError = (int) rc ;

if((rc == SQL_SUCCESS ) ||(rc == SQL_SUCCESS_WITH_INFO))
{
      m_bOpen = TRUE ;
   TRACE0("Open database Succeed !\n") ;
   return TRUE  ;
}
    else
{
      m_bOpen = FALSE ;
   TRACE0("Open Database Failed !\n") ;
   return FALSE ;
}

}

void CWdcDatabase::Close()
{
    if(m_bOpen)
{
  if(hstmt_select)
  {
   SQLFreeStmt(hstmt_select,SQL_DROP) ;
   hstmt_select = NULL ;
  }

  SQLDisconnect(hdbc) ;    /*Dis   hdbc*/
  SQLFreeConnect(hdbc) ;   /*Free  Odbc*/
  SQLFreeEnv(henv) ;       /*Free  henv*/  
  m_bOpen = false;
  TRACE0("Close database Succeed !\n") ;
}
}

BOOL CWdcDatabase::Execute(const CString &sSQL)
{
RETCODE rc ;
    unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG + 1] ;
SWORD cbmsg ;

m_sErrMsg = "" ;
m_sQuery = sSQL ;

if(!m_bOpen)
  return FALSE ;

SQLAllocStmt(hdbc,&hstmt) ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;

rc = SQLExecDirect(hstmt,
                 szQuery,
        SQL_NTS) ;

   m_nError = (int) rc ;
   if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
   {
       SQLTransact(henv,hdbc,SQL_COMMIT);
    SQLFreeStmt(hstmt,SQL_DROP) ;
    return TRUE ;
   }
   else
   {
     m_sErrMsg = "" ;
      while(SQLError(0,
               0,
      hstmt,
      szSQLSTATE,
      &nErr,
      msg,
      sizeof(msg),
      &cbmsg) == SQL_SUCCESS)
           m_sErrMsg = "\t\t" + (CString)msg + "\n" ;
      SQLFreeStmt(hstmt,SQL_DROP) ;
   return FALSE ;
   }

}

/*帶入條件為 Where 以后的條件*/
BOOL CWdcDatabase::DeleteRecord(CString &sWhereDelete)
{
   RETCODE rc  ;
   unsigned char szSQLSTATE[6] ;
   SDWORD nErr ;
   unsigned char msg[MAX_ERROR_MSG+1] ;
   SWORD cbmsg ;

   CString sTemp ;

   if(!m_bOpen)
    return FALSE ;

   m_sQuery = "" ;
   m_sErrMsg = "" ;
   
   /*開始構造刪除語句*/
   m_sQuery.Format("Delete From %s ",m_sTable) ;

/* int ff =0 ;
   for(int f= 0 ;f<m_nFields;f++)
   {
    if(m_bKeyField[f]) /*如果是表的主鍵
       {
         if(ff>0) /*如果主鍵超過2個,要把條件連接起來
    m_sQuery += " AND " ;
   ff++ ;

        if (m_bNumeric[f])
   sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
    else
   sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;
         
    m_sQuery += sTemp ;
    }
   }
*/
    if(sWhereDelete !="")
       m_sQuery +=" Where " + sWhereDelete ;

    TRACE0(m_sQuery) ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
    strcpy((char*)szQuery,m_sQuery) ;
    SQLAllocStmt(hdbc,&hstmt) ;
    rc = SQLExecDirect(hstmt,
                 szQuery,
        SQL_NTS)  ;

m_nError = (int) rc ;
    if(rc ==SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{ /*如果執行成功*/
     SQLTransact(henv,hdbc,SQL_COMMIT);
  SQLFreeStmt(hstmt,SQL_DROP) ;
  return TRUE ;
}
else
{
  m_sErrMsg = "" ;
        while(SQLError(0,
              0,
        hstmt,
        szSQLSTATE,
        &nErr,
        msg,
        sizeof(msg),
        &cbmsg) == SQL_SUCCESS)
       m_sErrMsg = "\t\t" + (CString) msg + "\n" ;
       SQLFreeStmt(hstmt,SQL_DROP) ;
    return FALSE ;
}

}

CString CWdcDatabase::Quote(CString &sText)
{
  CString sResult="" ;
  CString sChar   ;
  int iTextLen = sText.GetLength() ;

  for(int pos = 0 ;pos<iTextLen;pos++)
  {
     sChar = sText.Mid(pos,1) ;
  if (sChar == "'")
   sChar = "''" ;
  sResult += sChar ;
  }

  return  CString("'" + sResult + "'") ;

}

BOOL CWdcDatabase::AddRecord()
{
    unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG+1] ;
SWORD cbmsg ;

CString sTemp ;

if(!m_bOpen)
  return FALSE ;

    m_sQuery.Format("Insert Into %s(",m_sTable) ;
    
int ff=0 ;
for(int f=0 ;f<m_nFields;f++)
{
       if(ff>0)
     m_sQuery += "," ;
    ff ++ ;
    m_sQuery += m_sFieldName[f] ;
}

m_sQuery += ") values(" ;
ff = 0 ;
    for(f=0 ;f<m_nFields ;f++)
{
  if(ff>0)
   m_sQuery += "," ;

  ff ++ ;
  /*---如果數據不為空*/
      if(m_sFieldValue[f]!="")
    {
          if(m_bNumeric[f])
           sTemp.Format("%s",m_sFieldValue[f]) ;
   else
     sTemp.Format("%s",Quote(m_sFieldValue[f])) ;
    }
    else
    { /*如果數據為空*/
          sTemp.Format("%s","NULL") ;
    }

  m_sQuery += sTemp ;
}

m_sQuery += ")" ;

memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
SQLAllocStmt(hdbc,&hstmt) ;
rc = SQLExecDirect(hstmt,
                 szQuery,
        SQL_NTS) ;

m_nError = (int) rc ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
     SQLTransact(henv,hdbc,SQL_COMMIT);
        SQLFreeStmt(hstmt,SQL_DROP) ;
  hstmt=NULL ;
  return TRUE ;
}
else
{
  m_sErrMsg = "" ;
        while(SQLError(0,
              0,
        hstmt,
        szSQLSTATE,
        &nErr,
        msg,
        sizeof(msg),
        &cbmsg) == SQL_SUCCESS )

    m_sErrMsg += "\t\t" + (CString) msg +"\n" ;
          SQLFreeStmt(hstmt,SQL_DROP) ;
    return FALSE ;
}
}
/*更新表的指定紀錄*/
BOOL CWdcDatabase::UpdateRecord()
{
  unsigned char szSQLSTATE[6] ;
  SDWORD nErr ;
  unsigned char msg[MAX_ERROR_MSG + 1] ;
  SWORD cbmsg ;

  RETCODE rc ;
  CString sTemp ;

  if(!m_bOpen)
   return FALSE ;

  m_sQuery.Format("Update %s Set ",m_sTable) ;

  int ff = 0 ;
  for(int f= 0 ;f<m_nFields ;f++)
  {
     if (ff>0)
   m_sQuery += "," ;
     
  ff ++ ;

   if(m_sFieldValue[f]!="")  /*數據為空*/
   {
     if(m_bNumeric[f])
       sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
     else
       sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;
   }
   else
       sTemp.Format("%s=%s",m_sFieldName[f],NULL) ;

  m_sQuery += sTemp ;
  }
  m_sQuery += " Where " ;

  ff = 0 ;
  for(f=0 ;f<m_nFields ;f++)
  {
   if(m_bKeyField[f]) /*如果為主鍵*/
   {
         if(ff>0)
    m_sQuery += "," ;
   ff ++ ;
         if(m_bNumeric[f])
    sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
   else
    sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;

   m_sQuery += sTemp ;
   }
  }

  memset((char*)szQuery,0x00,sizeof(szQuery)) ;
  strcpy((char*)szQuery,m_sQuery) ;
  SQLAllocStmt(hdbc,
            &hstmt) ;
  rc = SQLExecDirect(hstmt,
                  szQuery,
      SQL_NTS) ;
  m_nError = (int) rc ;

  if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
  {  
      SQLTransact(henv,hdbc,SQL_COMMIT);
   SQLFreeStmt(hstmt,SQL_DROP) ;
   return TRUE ;
  }
  else
  {  
  m_sErrMsg = "" ;
      while(SQLError(0,
               0,
      hstmt,
      szSQLSTATE,
      &nErr,
      msg,
      sizeof(msg) ,
      &cbmsg ) == SQL_SUCCESS )
      m_sErrMsg += "\t\t" +(CString) msg + "\n" ;
    
   SQLFreeStmt(hstmt,SQL_DROP) ;
   return FALSE ;
  }

}

/* 查找紀錄---
返回值
    1: 即沒有錯誤發生的找到紀錄
    -1: 在查找過程中出現錯誤
    0: 查找過程當中沒有錯誤出現,但是沒有找到適合條件的紀錄,即沒有返回紀錄  */
int CWdcDatabase::SelectMatchingRecords(CString &sWhereContext)
{
   unsigned char szSQLSTATE[6];
   SDWORD nErr ;
   unsigned char msg[MAX_ERROR_MSG+1] ;
   SWORD cbmsg ;
   CString sTemp ;

   char szData[MAX_DATA] ;
   SDWORD cbData ;
   RETCODE rc ;

   if(!m_bOpen)
    return -1 ;

   sTemp="" ;
   int ff=0 ;
   for(int j=0;j<m_nFields;j++)
   {
       if(ff>0)
     sTemp += "," ;
    ff ++ ;
    sTemp += m_sFieldName[j] ;
   }

   if(sWhereContext == "")
      m_sQuery.Format("Select %s from %s",sTemp,m_sTable) ;
   else
   m_sQuery.Format("Select %s From %s Where %s",sTemp,m_sTable,sWhereContext) ;

   SQLAllocStmt(hdbc,&hstmt_select) ;
   memset((char*)szQuery,0x00,sizeof(szQuery)) ;
   strcpy((char*)szQuery,m_sQuery) ;

   rc = SQLExecDirect(hstmt_select,
                   szQuery,
       SQL_NTS) ;
   m_nError = (int) rc ;

   if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
   {
       rc = SQLFetch(hstmt_select );
       if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
    {  /*執行成功,并且有數據*/
      for(int f = 0 ; f<m_nFields ; f++)
   {
               rc = SQLGetData(hstmt_select,
                   f+1 ,
          SQL_C_CHAR,
          szData,
          sizeof(szData) ,
          &cbData ) ;
              
       if(cbData != SQL_NULL_DATA)
    {  /*如果數據不為空*/
                 if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
         m_sFieldValue[f] = CString(szData) ;
        else
       m_sFieldValue[f] = "" ;
    }
    else
     m_sFieldValue[f] = "" ;

   }   

     return 1 ;   /*執行成功,并且有數據*/
    }
    else if(rc == 100)
    {  /*查找成功,但是沒有數據*/
          return 0 ;
    }
   }
       m_sErrMsg = "" ;
    while(SQLError(0,
                0,
       hstmt_select,
       szSQLSTATE,
       &nErr,
       msg,
       sizeof(msg),
       &cbmsg) == SQL_SUCCESS )
       m_sErrMsg += "\t\t" +CString(msg) + "\n" ;
     
    SQLFreeStmt(hstmt_select,SQL_DROP) ;
    hstmt_select = NULL ;
    return -1 ;
}

BOOL CWdcDatabase::NextMatchingRecord()
{
   unsigned char szSQLSTATE[6] ;
   SDWORD nErr ;
   unsigned char msg[MAX_ERROR_MSG+1] ;
   SWORD cbmsg ;

   char szData[MAX_DATA] ;
   SDWORD cbData ;
   RETCODE rc ;

   if(!m_bOpen)
    return FALSE ;

   rc = SQLFetch(hstmt_select) ;
   if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
   {
       for(int f =0 ;f<m_nFields ; f++)
    {
          rc = SQLGetData(hstmt_select,
                 f+1 ,
           SQL_C_CHAR,
           szData,
           sizeof(szData),
           &cbData) ;
            if(cbData !=SQL_NULL_DATA)
   { /*如果數據不為空*/
              if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
            m_sFieldValue[f] = (CString) szData ;
        else
       m_sFieldValue[f] = "" ;
   }
   else
    m_sFieldValue[f] = "" ;

    }   
    return TRUE ;
    }

m_sErrMsg = "" ;
    while(SQLError(0,
             0,
       hstmt_select,
       szSQLSTATE,
       &nErr,
       msg,
       sizeof(msg),
       &cbmsg )==SQL_SUCCESS )
            
           m_sErrMsg += "\t\t" +CString (msg) + "\n" ;
        SQLFreeStmt(hstmt_select,SQL_DROP) ;
     hstmt_select = NULL ;

   return FALSE ;
}
/*統計符合條件的紀錄總數
  返回值
  -1: 執行出錯
  >0: 執行成功,并且返回統計結果 */
long CWdcDatabase::GetRecordCount(CString &sSel)
{
   unsigned char szSQLSTATE[6] ;
   SDWORD nErr ;
   unsigned char ErrMsg[500] ;
   SWORD cbmsg;
   long lRet ;  /*返回值*/

   unsigned char lpSelect[1000];
   memset((char*)lpSelect,0x00,sizeof(lpSelect)) ;
   if(sSel=="")
       sTemp.Format("Select count(*) from %s ",m_sTable) ;
   else
    sTemp.Format("Select Count(*) From %s Where %s",m_sTable,sSel) ;

   if(!m_bOpen)
    return -1  ;
   strcpy((char*)lpSelect,sTemp) ;
   SQLAllocStmt(hdbc,&hstmt_select) ;
   rc=SQLExecDirect(hstmt_select,
              lpSelect,
     SQL_NTS) ;
   if(rc==SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
   { /* SQLExecDirect True*/
       SQLBindCol(hstmt_select,1,SQL_INTEGER,&lRet,sizeof(int),NULL) ;
    rc = SQLFetch(hstmt_select) ;
    if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
    { /*有數據*/
    SQLFreeStmt(hstmt_select,SQL_DROP) ;
    hstmt_select = NULL ;
          return lRet ;
    }
    else if (rc == 100)
    { /*沒有數據*/
    SQLFreeStmt(hstmt_select,SQL_DROP) ;
    hstmt_select = NULL ;
          return 0 ;
    }
       else if (rc < 0)
    { /*出錯*/
         goto end ;
    }
   }
   else
   { /* SQLExecDirect FALSE */
    goto end ;
  }

end:
  {
      m_sErrMsg = "" ;
         while(SQLError(0,
              0,
        hstmt_select,
                       szSQLSTATE,
        &nErr,
        ErrMsg,
        sizeof(ErrMsg),
        &cbmsg)==SQL_SUCCESS)
         m_sErrMsg += "\t\t" + CString(ErrMsg) +"\n" ;  

   SQLFreeStmt(hstmt_select,SQL_DROP) ;
   hstmt_select = NULL ;
    return -1 ;
  }
}
/*非常有用函數,用在確保語句句柄釋放*/
void CWdcDatabase::DropHstmtSelect()
{
if(hstmt_select !=NULL)
{
  SQLFreeStmt(hstmt_select,SQL_DROP) ;
  hstmt_select = NULL ;
}
}

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        老司机精品视频线观看86| 国产精品18久久久久久久网站| 一区二区三区精品在线| 国产成人精品免费网站| 日本一区二区免费在线| 国产成人高清视频| 中文字幕日韩av资源站| 色综合久久久久久久久久久| 亚洲电影一级片| 精品国内二区三区| 岛国一区二区三区| 亚洲与欧洲av电影| 日韩欧美成人激情| av电影天堂一区二区在线观看| 亚洲美女精品一区| 欧美精品在线观看播放| 国产精品77777| 亚洲午夜电影在线观看| 日韩欧美电影在线| 91片黄在线观看| 精品在线一区二区| 亚洲三级在线播放| 日韩欧美国产一区二区在线播放| 91在线观看高清| 精品无人区卡一卡二卡三乱码免费卡| 中文字幕一区二区三区在线不卡| 欧美丰满美乳xxx高潮www| 99久久精品免费看| 狠狠久久亚洲欧美| 视频一区视频二区中文| 一区二区三区免费在线观看| 国产欧美一区二区三区在线老狼| 欧美日韩精品一区二区| 粗大黑人巨茎大战欧美成人| 六月丁香婷婷色狠狠久久| 中文字幕亚洲在| 欧美精品一区二区三区蜜桃 | 亚洲欧美视频一区| 日韩亚洲欧美成人一区| 色综合天天综合在线视频| 国产另类ts人妖一区二区| 天天综合色天天| 亚洲欧洲综合另类在线| 国产精品美女视频| 日本一区二区三区在线观看| 欧美大片免费久久精品三p| 在线免费不卡视频| www.久久精品| 北条麻妃国产九九精品视频| 国产精品1区2区3区在线观看| 日本va欧美va瓶| 天天av天天翘天天综合网色鬼国产| 亚洲天堂福利av| 亚洲特黄一级片| 国产精品美女一区二区在线观看| 国产欧美一区二区在线| 精品久久久久久久久久久院品网| 这里只有精品免费| 欧美日韩大陆在线| 欧美精品v国产精品v日韩精品| 欧美日韩在线一区二区| 欧美麻豆精品久久久久久| 欧美色图一区二区三区| 欧美日韩一区二区在线视频| 欧美日韩国产精品自在自线| 欧美日韩成人一区| 欧美顶级少妇做爰| 日韩精品最新网址| 国产亚洲婷婷免费| 中文字幕在线观看一区| 一区二区国产盗摄色噜噜| 亚洲成a人v欧美综合天堂| 蜜桃视频一区二区三区在线观看| 久久精品国产在热久久| 成人激情校园春色| 91丨九色丨国产丨porny| 色妹子一区二区| 3atv一区二区三区| 精品国产伦一区二区三区观看体验| 久久久久97国产精华液好用吗| 国产精品美女www爽爽爽| 亚洲精品国产无天堂网2021| 亚洲一卡二卡三卡四卡五卡| 日韩成人av影视| 国产麻豆精品一区二区| 成人免费高清在线观看| 欧美丰满嫩嫩电影| 国产欧美精品一区二区色综合朱莉| 亚洲视频中文字幕| 免费高清成人在线| www.久久精品| 欧美一区二区不卡视频| 国产欧美一区二区精品婷婷| 婷婷丁香久久五月婷婷| 高清不卡在线观看| 欧美日韩一区二区三区视频| xvideos.蜜桃一区二区| 亚洲另类中文字| 国内一区二区在线| 欧美视频精品在线观看| 中文av一区二区| 蜜臀av一级做a爰片久久| 日本高清免费不卡视频| 国产亚洲欧洲997久久综合| 亚洲一区二三区| 成人激情免费电影网址| 日韩美女一区二区三区| 亚洲一区二区三区四区五区黄 | 99精品国产91久久久久久| 欧美日韩高清在线播放| 国产精品国产三级国产普通话蜜臀 | 无码av中文一区二区三区桃花岛| 国产精品白丝jk白祙喷水网站| 欧美日韩激情在线| 中文字幕一区二区在线观看| 国产乱对白刺激视频不卡| 777欧美精品| 丝袜亚洲另类欧美综合| 欧美性生活久久| 一区二区高清在线| 欧美怡红院视频| 亚洲资源在线观看| 91国内精品野花午夜精品| **性色生活片久久毛片| 成人av在线资源网站| 国产三级精品在线| 国产成人av影院| 国产欧美日韩综合精品一区二区| 精品一区二区三区在线播放| 欧美一区二区视频在线观看2022| 亚洲成人黄色影院| 欧美美女bb生活片| 亚洲成av人片一区二区| 91国模大尺度私拍在线视频| 亚洲欧美偷拍卡通变态| 色综合久久综合网97色综合| 国产精品成人免费在线| 91免费国产在线| 亚洲综合精品自拍| 这里是久久伊人| 国产精品一区二区你懂的| 国产日产欧美一区二区视频| 99精品久久免费看蜜臀剧情介绍| 亚洲靠逼com| 欧美另类久久久品| 日本网站在线观看一区二区三区 | 亚洲国产综合91精品麻豆| 欧美在线一二三| 免费人成精品欧美精品| 久久久综合视频| av在线不卡免费看| 亚洲超碰97人人做人人爱| 欧美成人免费网站| 成人中文字幕电影| 夜夜夜精品看看| 91精品国产91综合久久蜜臀| 国产91精品一区二区麻豆网站| 国产精品国产自产拍在线| 欧美少妇一区二区| 国产高清精品网站| 伊人开心综合网| 日韩精品一区二区在线| 北条麻妃国产九九精品视频| 亚洲高清免费观看 | 亚洲.国产.中文慕字在线| 精品99久久久久久| 99久久精品国产麻豆演员表| 亚洲国产裸拍裸体视频在线观看乱了| 欧美一区二区人人喊爽| 成人午夜精品在线| 午夜视黄欧洲亚洲| 日本一区二区三区视频视频| 欧美视频一区二区在线观看| 国产一区二区电影| 亚洲综合色婷婷| 久久精品亚洲麻豆av一区二区 | 在线日韩一区二区| 精品一区二区三区免费视频| 亚洲欧洲美洲综合色网| 日韩欧美中文一区| 91麻豆文化传媒在线观看| 日本三级韩国三级欧美三级| 亚洲免费观看高清完整版在线 | 精品999在线播放| 在线观看日韩毛片| 国产jizzjizz一区二区| 奇米色一区二区| 亚洲自拍偷拍综合| 国产精品网站一区| 国产亚洲精品资源在线26u| 日韩视频中午一区| 欧美日韩一区二区三区四区| 色综合天天狠狠| 波多野结衣中文字幕一区 | 欧美午夜理伦三级在线观看| 粉嫩在线一区二区三区视频| 久久精品国产亚洲高清剧情介绍| 调教+趴+乳夹+国产+精品| 亚洲一区二区在线观看视频| 国产精品久久久久久久久免费丝袜|