• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            封裝ADO編程Connection對象的類

             

            // ADOConnection.cpp: implementation of the CADOConnection class.
            //
            //////////////////////////////////////////////////////////////////////
            /******************************************************************************
            [文件名]: ADOConnection.cpp(ADO連接對象_ConnectionPtr封裝類)
            [版本號]: Ver1.0(2008-06-09)
            [作  者]: isabc (E-mail:isabc@163.com QQ:272126451)
            -------------------------------------------------------------------------------
            連接:通過"連接"可從應用程序訪問數據源,連接是交換數據所必需的環境。
            -------------------------------------------------------------------------------
            注意事項:
                    1. 必須在下面指明 msado15.dll 的全路徑, 一般在 "C:\Program Files\
                       Common Files\System\ADO\" 目錄下.
                    2. 在使用本類之前必須要初始化 COM 環境, 可以調用 CoInitialize(NULL)  
                       來初始化, 用 CoUninitialize() 釋放;
                    3. 在使用記錄集對象前必須先調用 CAdoConnection::Open() 連接數據庫,
                       連接后可給多個 CAdoRecordSet 對象使用, 用完后須關閉數據庫.
                    4. 使用記錄集執行SQL語句之前, 要使用構建方法或調用 SetAdoConnection() 
                       關聯到連接對象.
            *****************************************************************************
            */

            #include 
            "stdafx.h"
            #include 
            "ADODataBase.h"
            #include 
            "ADOConnection.h"
            #include 
            <math.h>

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


            //////////////////////////////////////////////////////////////////////
            // Construction/Destruction
            //////////////////////////////////////////////////////////////////////

            CADOConnection::CADOConnection()
            {
                
            //-----------------------創建 Connection 對象-----------------------------
                m_pConnection.CreateInstance("ADODB.Connection");
                #ifdef _DEBUG
                
            if (m_pConnection == NULL)
                
            {
                    AfxMessageBox(
            "Connection 對象創建失敗! 請確認是否初始化了COM環境\r\n");
                }

                
            #endif
                ASSERT(m_pConnection 
            != NULL);
            }


            CADOConnection::
            ~CADOConnection()
            {
                
            if (m_pConnection != NULL)
                
            {
                    Release();
                }

            }


            /*=============================================================================
            Name: 連接到數據源.
            -------------------------------------------------------------------------------
            Params:    [lpszConnect]: 連接字符串, 包含連接信息.
                    [lOptions]:    可選. 決定該方法是以同步還是異步的方式連接數據源. 
                                可以是如下某個常量:
            ---------------------|---------------------------------------------------------
            [常量]                 |[說明] 
            ---------------------|---------------------------------------------------------
            adConnectUnspecified |(默認)同步方式打開連接. 
            adAsyncConnect         |異步方式打開連接. Ado用 ConnectComplete 事件來通知已經完成連接. 
            -------------------------------------------------------------------------------
            Remark: 調用連接對象的成員函數Open()
            =============================================================================
            */

            BOOL CADOConnection::Open(LPCTSTR lpszConnect, 
            long lOptions)
            {
                ASSERT(m_pConnection 
            != NULL);
                ASSERT(AfxIsValidString(lpszConnect));
                
                
            if (strcmp(lpszConnect, _T("")) != 0)
                
            {
                    m_strConnect 
            = lpszConnect;
                }


                
            if (m_strConnect.IsEmpty())
                
            {
                    ASSERT(FALSE);
                    
            return FALSE;
                }


                
            if (IsOpen()) 
                    Close();

                
            try
                
            {
                    
            // 連接數據庫 ---------------------------------------------
                    return (m_pConnection->Open(_bstr_t(LPCTSTR(m_strConnect)), """", lOptions) == S_OK);
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: 連接數據庫發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    TRACE(_T(
            "%s\r\n"), GetLastErrorText());
                    
            return FALSE;
                }
             
                
            catch ()
                
            {
                    TRACE(_T(
            "Warning: 連接數據庫時發生未知錯誤:"));
                }

                
            return FALSE;
            }


            /*=============================================================================
            Name:    連接 SQL SERVER 數據庫. 
            -------------------------------------------------------------------------------
            Params:        [dbsrc]:    SQL SERVER 服務器名.
                        [dbname]:    默認的數據庫名.
                        [user]:        用戶名.
                        [pass]:        密碼.
            ------------------------------------------------------------------------------
            調用本類成員函數Open()
            =============================================================================
            */

            BOOL CADOConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, 
            long lOptions)
            {
                CString strConnect 
            = _T("Provider=SQLOLEDB.1; Data Source="+ dbsrc + 
                                     _T(
            "; Initial Catalog="+ dbname  +
                                     _T(
            "; User ID="+ user + 
                                     _T(
            "; PWD="+ pass;
                
            return Open(LPCTSTR(strConnect), lOptions);
            }


            /*=============================================================================
            Name:    連接 ACCESS 數據庫. 
            -------------------------------------------------------------------------------
            Params:        [dbpath]:    MDB 數據庫文件路徑名.
                        [pass]:        訪問密碼.
            ------------------------------------------------------------------------------
            調用本類成員函數Open()
            =============================================================================
            */

            BOOL CADOConnection::ConnectAccess(CString dbpath, CString pass, 
            long lOptions)
            {
                CString strConnect 
            = _T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ dbpath;
                
            if (pass != _T("")) 
                
            {
                    strConnect 
            += _T("Jet OLEDB:Database Password="+ pass + _T(";");
                }

                
            return Open(LPCTSTR(strConnect), lOptions);
            }


            /*=============================================================================
            Name:    通過 udl 文件連接數據庫. 
            -------------------------------------------------------------------------------
            Params:        [strFileName]:    UDL 數據庫連接文件路徑名.
            ------------------------------------------------------------------------------
            調用本類成員函數Open()
            =============================================================================
            */

            BOOL CADOConnection::OpenUDLFile(LPCTSTR strFileName, 
            long lOptions)
            {
                CString strConnect 
            = _T("File Name=");
                strConnect 
            += strFileName;
                
            return Open(LPCTSTR(strConnect), lOptions);
            }



            /*=============================================================================
            Name:    關閉與數據源的連接.
            -------------------------------------------------------------------------------
            Remarks: 使用 Close 方法可關閉 Connection 對象以便釋放所有關聯的系統資源. 調用
            連接對象成員函數Close()
            =============================================================================
            */

            void CADOConnection::Close()
            {
                
            try
                
            {
                    
            if (m_pConnection != NULL && IsOpen()) 
                    
            {
                        m_pConnection
            ->Close();//關閉連接
                    }

                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: 關閉數據庫發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                }
             
            }


            /*=============================================================================
            Name:    關閉連接并釋放對象.
            -------------------------------------------------------------------------------
            Remarks: 關閉連接并釋放connection對象.
            =============================================================================
            */

            void CADOConnection::Release()
            {
                
            if (IsOpen()) 
                    Close();
                m_pConnection
            ->Release();//釋放連接對象
            }


            /*=============================================================================
            Name:        執行指定的查詢、SQL 語句、存儲過程等.
            ----------------------------------------------------------
            Remarks:    請參考 CAdoRecordSet 類的Open方法. 返回的 Recordset 對象始
                        終為只讀、僅向前的游標.
            =============================================================================
            */

            _RecordsetPtr CADOConnection::Execute(LPCTSTR lpszSQL, 
            long lOptions)
            {
                ASSERT(m_pConnection 
            != NULL);
                ASSERT(AfxIsValidString(lpszSQL));

                
            try
                
            {
                    
            return m_pConnection->Execute(_bstr_t(lpszSQL), NULL, lOptions);
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: Execute 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"),
                                e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return FALSE;
            }


            /*=============================================================================
            Name:        取消操作
            -------------------------------------------------------------------------------
            Remarks:    請參考 CAdoRecordSet 類 Cancel 方法.
            =============================================================================
            */

            BOOL CADOConnection::Cancel()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->Cancel();
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: Cancel 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"),
                                e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return FALSE;
            }


            /*=============================================================================
            Name:    取得最后發生的錯誤信息.
            =============================================================================
            */

            CString CADOConnection::GetLastErrorText()
            {
                ASSERT(m_pConnection 
            != NULL);
                CString strErrors 
            = "";
                
            try
                
            {
                    
            if (m_pConnection != NULL)
                    
            {
                        ErrorsPtr pErrors 
            = m_pConnection->Errors;
                        CString strError;
                        
            for (long n = 0; n < pErrors->Count; n++)
                        
            {
                            ErrorPtr pError 
            = pErrors->GetItem(n);
                            strError.Format(_T(
            "Description: %s\r\nState: %s, Native: %d, Source: %s\r\n"),
                                            (LPCTSTR)pError
            ->Description,
                                            (LPCTSTR)pError
            ->SQLState,
                                                     pError
            ->NativeError,
                                            (LPCTSTR)pError
            ->Source);
                            strErrors 
            += strError;
                        }

                    }

                    
            return strErrors;
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetLastError 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return strErrors;
                }
             
                
            return strErrors;
            }


            ErrorsPtr CADOConnection::GetErrors()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            if (m_pConnection != NULL)
                    
            {
                        
            return m_pConnection->Errors;
                    }

                    
            return NULL;
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetErrors 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return NULL;
                }
             
                
            return NULL;
            }


            ErrorPtr CADOConnection::GetError(
            long index)
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            if (m_pConnection != NULL)
                    
            {
                        ErrorsPtr pErrors 
            =  m_pConnection->Errors;
                        
            if (index >= 0 && index < pErrors->Count)
                        
            {
                            
            return pErrors->GetItem(_variant_t(index));
                        }

                    }

                    
            return NULL;
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetError 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return NULL;
                }
             
                
            return NULL;
            }


            /*========================================================================
                Name:        取得默認數據庫的名稱.
            ==========================================================================
            */

            CString CADOConnection::GetDefaultDatabase()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return CString(LPCTSTR(_bstr_t(m_pConnection->GetDefaultDatabase())));//默認數據庫名
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetDefaultDatabase 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return CString(_T(""));
                }
             
            }


            /*=============================================================================
            Name:        取得 Connection 對象提供者的名稱.
            =============================================================================
            */

            CString CADOConnection::GetProviderName()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return CString(LPCTSTR(_bstr_t(m_pConnection->GetProvider())));//連接對象提供者
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetProviderName 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return CString(_T(""));
                }
             
            }


            /*=============================================================================
                Name:        取得 ADO 的版本號
            =============================================================================
            */

            CString CADOConnection::GetVersion()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return CString(LPCTSTR(_bstr_t(m_pConnection->GetVersion())));//獲取ADO版本信息
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetVersion 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return CString(_T(""));
                }
             
            }

            /*=============================================================================
                Name:    檢測連接對象是否為打開狀態.
            =============================================================================
            */

            BOOL CADOConnection::IsOpen()
            {
                
            try
                
            {
                    
            return (m_pConnection != NULL && (m_pConnection->State & adStateOpen));//是否打開狀態
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: IsOpen 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return FALSE;
            }


            /*=============================================================================
            Name:        取得對象的狀態(同 Recordset 對象的 GetState 方法).
            -------------------------------------------------------------------------------
            returns:    返回下列常量之一的長整型值.
                    [常量]                [說明] 
            -------------------------------------------------------------------------------
                    adStateClosed        指示對象是關閉的. 
                    adStateOpen            指示對象是打開的. 
            -------------------------------------------------------------------------------
                Remarks:        可以隨時使用 State 屬性取得指定對象的當前狀態.
            =============================================================================
            */

            long CADOConnection::GetState()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->GetState();//對象狀態
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetState 發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return -1;
                }
             
                
            return -1;
            }


            /*=============================================================================
            Name:        取得在 Connection 對象中修改數據的可用權限.
            -------------------------------------------------------------------------------
                returns:    返回以下某個 ConnectModeEnum 的值.
                    [常量]                 [說明] 
            -------------------------------------------------------------------------------
                    adModeUnknown         默認值. 表明權限尚未設置或無法確定. 
                    adModeRead             表明權限為只讀. 
                    adModeWrite             表明權限為只寫. 
                    adModeReadWrite         表明權限為讀/寫. 
                    adModeShareDenyRead  防止其他用戶使用讀權限打開連接. 
                    adModeShareDenyWrite 防止其他用戶使用寫權限打開連接. 
                    adModeShareExclusive 防止其他用戶打開連接. 
                    adModeShareDenyNone  防止其他用戶使用任何權限打開連接.
            -------------------------------------------------------------------------------
                Remarks: 使用 Mode 屬性可設置或返回當前連接上提供者正在使用的訪問權限.
            =============================================================================
            */

            ConnectModeEnum CADOConnection::GetMode()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->GetMode();//獲取連接模式(權限)
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetMode 發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return adModeUnknown;
                }
             
                
            return adModeUnknown;
            }


            /*=============================================================================
            Name:        設置在 Connection 中修改數據的可用權限. 請參考 GetMode 方法.
            -------------------------------------------------------------------------------
            Remarks:    只能在關閉 Connection 對象時方可設置 Mode 屬性.
            =============================================================================
            */

            BOOL CADOConnection::SetMode(ConnectModeEnum mode)
            {
                ASSERT(m_pConnection 
            != NULL);
                ASSERT(
            !IsOpen());

                
            try
                
            {
                    m_pConnection
            ->PutMode(mode);//設置連接模式(權限)
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: SetMode 發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return TRUE;
            }


            /*=============================================================================
            Name:        取得連接時間.
            ===============================================================================
            */

            long CADOConnection::GetConnectTimeOut()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->GetConnectionTimeout();//獲取連接時間
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: GetConnectTimeOut 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return -1;
                }
             
                
            return -1;
            }


            /*========================================================================
            Name:        設置連接時間.
            ==========================================================================
            */

            BOOL CADOConnection::SetConnectTimeOut(
            long lTime)
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    m_pConnection
            ->PutConnectionTimeout(lTime);//設置超時時間
                    return TRUE;
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: SetConnectTimeOut 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
            }


            /*========================================================================
                Name:        從數據源獲取數據庫信息.
                -----------------------------------------------------
                Params:        QueryType  所要運行的模式查詢類型.
                -----------------------------------------------------
                returns:    返回包含數據庫信息的 Recordset 對象. Recordset 將以只讀、靜態
                        游標打開.
            ==========================================================================
            */

            _RecordsetPtr CADOConnection::OpenSchema(SchemaEnum QueryType)
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->OpenSchema(QueryType, vtMissing, vtMissing);//從提供者獲取數據庫模式信息
                }

                
            catch(_com_error e)
                
            {
                    TRACE(_T(
            "Warning: OpenSchema方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return NULL;
                }
             
                
            return NULL;
            }


            /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                          ------------------------------------------------
                                                事務處理
                          ------------------------------------------------
            &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
            */


            /*=============================================================================
            Name:        開始新事務.
            -------------------------------------------------------------------------------
            returns:    對于支持嵌套事務的數據庫來說, 在已打開的事務中調用 BeginTrans 
                方法將開始新的嵌套事務. 返回值將指示嵌套層次: 返回值為 1 表示已打開頂層
                事務 (即事務不被另一個事務所嵌套), 返回值為 2 表示已打開第二層事務(嵌套
                在頂層事務中的事務), 依次類推.
            -------------------------------------------------------------------------------
            Remarks:    一旦調用了 BeginTrans 方法, 在調用 CommitTrans 或 RollbackTrans
                結束事務之前, 數據庫將不再立即提交所作的任何更改.
            =============================================================================
            */

            long CADOConnection::BeginTrans()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return m_pConnection->BeginTrans();//開始新事務
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: BeginTrans 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return -1;
                }
             
                
            return -1;
            }


            /*=============================================================================
            Name:        保存任何更改并結束當前事務.
            -------------------------------------------------------------------------------
            Remarks:    調用 CommitTrans 或 RollbackTrans 只影響最新打開的事務; 在處理任何
                更高層事務之前必須關閉或回卷當前事務.
            =============================================================================
            */

            BOOL CADOConnection::CommitTrans()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return SUCCEEDED(m_pConnection->CommitTrans());//保存任何更改并結束當前事務
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: CommitTrans 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return FALSE;
            }


            /*=============================================================================
                Name:        取消當前事務中所作的任何更改并結束事務.
            ==============================================================================
            */

            BOOL CADOConnection::RollbackTrans()
            {
                ASSERT(m_pConnection 
            != NULL);
                
            try
                
            {
                    
            return SUCCEEDED(m_pConnection->RollbackTrans());//取消當前事務中所作的任何更改并結束事務
                }

                
            catch (_com_error e)
                
            {
                    TRACE(_T(
            "Warning: RollbackTrans 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
                    
            return FALSE;
                }
             
                
            return FALSE;
            }



            posted on 2008-06-10 21:20 isabc 閱讀(2151) 評論(0)  編輯 收藏 引用 所屬分類: 分享代碼數據庫

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            青青久久精品国产免费看| 欧美亚洲国产精品久久高清| 97精品伊人久久久大香线蕉 | 久久人人爽人人爽人人爽 | 久久er国产精品免费观看8| 久久99精品综合国产首页| 久久精品国产亚洲AV大全| 人妻少妇久久中文字幕| 久久久久亚洲AV无码网站| 久久国产色AV免费观看| 国产精品视频久久| 久久久久国产一级毛片高清版| 久久久久免费精品国产| 91久久福利国产成人精品| 精品国产综合区久久久久久 | 东方aⅴ免费观看久久av| 亚洲精品无码久久久久去q | 久久伊人精品青青草原日本| 久久久91人妻无码精品蜜桃HD| 久久av高潮av无码av喷吹| 亚洲v国产v天堂a无码久久| 97香蕉久久夜色精品国产 | 欧美大战日韩91综合一区婷婷久久青草| 久久久99精品成人片中文字幕 | 国产精品亚洲综合久久| 无码超乳爆乳中文字幕久久| 99久久777色| 青青久久精品国产免费看| 国产aⅴ激情无码久久| 国产精品一区二区久久不卡| 草草久久久无码国产专区| 久久综合色老色| 国产91久久精品一区二区| 欧美久久天天综合香蕉伊| 久久天天躁狠狠躁夜夜不卡| 国产精品久久精品| 亚洲精品成人网久久久久久| 91精品国产91久久久久福利| 久久亚洲精品无码观看不卡| 国产成人久久AV免费| 久久久久九九精品影院|