亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據

在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據

熱門標簽:蘇州如何辦理400電話 400電話辦理怎么樣 臨沂智能電話機器人加盟 地圖標注軟件免費下載 西寧呼叫中心外呼系統線路商 百應電話機器人外呼系統 外呼電話機器人成本 聯通官網400電話辦理 網絡電話外呼系統上海

導言:

  正如在教程概述插入、更新和刪除數據里討論的那樣,GridView控件內置更新和刪除功能,而DetailsView和FormView控件不僅具有編輯和刪除功能,還有插入功能。我們不要寫一行代碼就可一將這些功能直接應用于一個數據源控件。在這篇教程里,我們指出ObjectDataSource控件最好與GridView, DetailsView和FormView控件一起使用,才更好的實現插入、更新和刪除功能。對SqlDataSource控件來說,同樣如此!

  對ObjectDataSource控件來說,為了實現插入、更新和刪除,我們需要指定調用那個方法來實現插入、更新和刪除功能。對SqlDataSource來說,我們需要指定INSERT, UPDATE和DELETE三種SQL語句(或存儲過程)。就像接下來在本章探討的那樣,我們可以手寫代碼或SqlDataSource的設置數據源向導自動的生成。
注意:由于我們已經探討過了GridView, DetailsView和FormView控件的插入、編輯和刪除功能,在本章我們主要關注怎樣設置SqlDataSource以支持這些功能。倘若你想重溫如何實現GridView, DetailsView和FormView的這些功能,參考教程概述插入、更新和刪除數據

第一步:指定INSERT, UPDATE和DELETE命令

就像在前2章教程探討的那樣,從SqlDataSource控件檢索數據,需要設置2個屬性:

1. ConnectionString,指定要查詢的數據庫。
2. SelectCommand,指定用來返回結果的ad-hoc SQL語句或存儲過程的名稱。

  對SelectCommand里的參數來說,其值在SqlDataSource控件的SelectParameters部分指定,可以為“硬編碼”值,普通的參數源值(比如來自于查詢字符串、 session變量、Web控件等)、或通過編程設置。當一個數據Web控件調用SqlDataSource的Select() 方法時——不管是自動的還是通過編程調用的,發生這些事件:連接指定數據庫,對參數賦值并執行查詢,檢索并返回結果。返回的結果是DataSet還是DataReader,取決于SqlDataSource的DataSourceMode屬性是設置為DataSet還是DataReader。

  和選擇數據一樣,要實現插入、更新和刪除數據,我們只要提供相應的INSERT, UPDATE和DELETE SQL語句就夠了。方法是對InsertCommand, UpdateCommand和DeleteCommand屬性賦以相應的 INSERT, UPDATE和DELETE SQL語句。如果這些SQL語句包含參數(現實中經常碰到),將這些參數放在相應的InsertParameters, UpdateParameters和DeleteParameters部分。

  一旦指定了SqlDataSource控件的InsertCommand, UpdateCommand和DeleteCommand三種命令,就可以在相應的數據Web控件啟用插入、編輯和刪除功能。為驗證起見,我們拓展Querying.aspx頁面的刪除功能。

  打開SqlDataSource文件夾的InsertUpdateDelete.aspx和Querying.aspx頁面,首先選擇Querying.aspx頁面,進入設計模式,選中SqlDataSource控件和GridView控件(ID分別為ProductsDataSource和GridView1),點“編輯”菜單,選“復制”(或直接按Ctrl+C),然后將這2個控件粘貼在InsertUpdateDelete.aspx頁面。在瀏覽器里測試該頁面,你將會看到表Products里所有產品的ProductID, ProductName和UnitPrice顯示出來。


圖1:所有產品按ProductID排序并顯示出來

添加SqlDataSource控件的eleteCommand命令和DeleteParameters屬性

  到目前為止,我們的SqlDataSource只是從表Products返回記錄,然后在GridView控件里顯示出來。我們的目標是擴展其功能,允許用戶在GridView控件刪除數據。
  為此,我們需要為SqlDataSource控件的DeleteCommand和DeleteParameters屬性賦值,然后啟用GridView的刪除功能。

可以用下面的方法為SqlDataSource控件的DeleteCommand和DeleteParameters屬性賦值:

1. 聲明代碼
2. 在屬性窗口指定屬性值
3. 在設置數據源向導的“指定自定義SQL語句或存儲過程”界面里指定
4. 在設置數據源向導的“來自表或視圖的指定列”界面里點“高級”按鈕,這樣做會自動生成DeleteCommand和DeleteParameters屬性里要用到的DELETE SQL語句和參數。

  我們將在接下來的第2步探討如何自動得生成DELETE語句。現在我們嘗試在屬性窗口里設置DeleteCommand和DeleteParameters。當然直接聲明代碼和使用設置數據源向導也可以辦到。

  打開InsertUpdateDelete.aspx頁面,進入設計模式,選中ID為ProductsDataSource的SqlDataSource控件,打開其屬性窗口(從視圖菜單中選屬性窗口,或直接按F4按鈕)選擇DeleteQuery屬性,在方框右邊會出現一個橢圓型區域。


圖2:在屬性窗口里選擇DeleteQuery屬性。

  注意:SqlDataSource控件其實并沒有DeleteQuery屬性。或者更準確的說,它是由DeleteCommand和DeleteParameters兩個屬性構成的。雖然我們在設計模式里可以看到屬性窗口列出了DeleteQuery屬性,但切換到源碼模式的時候,我們會看到代碼里只有 DeleteCommand屬性而沒有DeleteQuery屬性。

  點擊該橢圓型區域,將轉換到“編輯命令和屬性”對話框(見圖3)。在該對話框,你可以指定DELETE SQL語句及要用的參數。在DELETE: command文本框里鍵入如下查詢:(手工輸入或者借助查詢生成器,悉聽尊便):

DELETE FROM Products
WHERE ProductID = @ProductID

  然后,點Refresh Parameters按鈕,將參數@ProductID添加到下面的參數列表。


圖3:在屬性窗口里選擇DeleteQuery屬性(譯注:圖片說明有誤)

  暫時不要為該參數賦值(在參數源下列列表選“None”)。當我們為GridView控件啟用刪除功能后,GridView將自動為該參數傳遞值,傳遞的值為被選擇刪除的那行記錄的DataKeys值。

  注意:在DELETE查詢語句中使用的參數名必須與GridView, DetailsView或FormView控件的DataKeyNames值一樣。比如:因為表Products的主鍵是ProductID,自然地,GridView控件的DataKeyNames值也是ProductID,相應地,DELETE語句中的參數應設置為@ProductID(當然,你也可以任意地設置為其它名字,比如@ID)。當參數名與DataKeyNames不匹配時(比如你將參數設置為@ID),GridView控件無法將DataKeys值傳給SQL語句中的參數。

在“編輯命令和參數”對話框里鍵入相關刪除信息后,點“OK”按鈕。進代碼模式查看代碼:

asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
 "SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"
DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID">
DeleteParameters>
 asp:Parameter Name="ProductID" />
/DeleteParameters>
/asp:SqlDataSource>

設置GridView控件以支持刪除功能

  設置了DeleteCommand屬性后,GridView控件的智能標簽里便可包含刪除選項。就像在教程概述插入、更新和刪除數據里探討的一樣,點擊該按鈕將促使GridView控件增加一個CommandField列,同時將ShowDeleteButton屬性設置為true。就像在圖4展示的那樣,當通過瀏覽器訪問該頁面時,GridView控件將包含一個刪除按鈕。


圖4:在GridView控件中,每一行記錄都包含一個刪除按鈕

  點擊刪除按鈕后,將發生postback事件,GridView控件將該行記錄的DataKeys值賦值給參數ProductID,并調用SqlDataSource控件的Delete()方法。SqlDataSource控件隨即連接到數據庫并執行DELETE命令。最后GridView控件再次綁定SqlDataSource控件,獲取并展示當前的產品(因為執行了刪除命令,剛被刪除的那個產品也就顯示不出來了)。

  注意:因為GridView控件是將它的DataKeys值傳給SqlDataSource控件的參數,所以尤為重要的是將GridView的DataKeyNames屬性設置為主鍵列,而且SqlDataSource控件的SelectCommand要返回這些列。具體到本例,最好將SqlDataSource控件的DeleteCommand里的參數設置為@ProductsID。如果DataKeyNames 屬性沒有設置,或參數名不是@ProductsID,點擊刪除按鈕時也會發生postback事件,但不會成功地刪除記錄。

圖5形象地顯示了該原理。


圖5:點擊GridView控件的刪除按鈕將會調用SqlDataSource的Delete()方法

第2步:自動的創建INSERT、UPDATE和DELETE語句

  就像在第1步中提到的那樣,INSERT、UPDATE和DELETE SQL語句可以在屬性窗口設置,也可以通過控件聲明來構造。然而這樣需要我們手寫代碼,單調且容易出錯。幸運的是,我們可以通過數據源設置向導來自動的生產INSERT、UPDATE和 DELETE語句。方法是使用它的“指定來自表或視圖的列”模式。

  打開InsertUpdateDelete.aspx頁面,在設計模式里添加一個DetailsView控件,設置其ID為ManageProducts,接下來,在其智能標簽里選擇“創建新數據源”,創建一個名為ManageProductsDataSource的SqlDataSource,如下圖:


圖6:創建一個名為ManageProductsDataSource的SqlDataSource控件

  選擇數據庫時,在下拉列表中選擇NORTHWINDConnectionString連接字符串,點下一步,在“設置選擇命令”界面里,選中“指定來自表或視圖的列”,在下拉列表中選擇表Products,選中表的ProductID、ProductName、UnitPrice和 Discontinued列。


圖7:返回表Products的ProductID、ProductName,、UnitPrice和Discontinued

  為了自動創建基于選定表和選定列的INSERT、UPDATE和DELETE命令,點擊“高級”按鈕,選中“生成INSERT、UPDATE和DELETE命令”選項。


圖8:選中“生成INSERT、UPDATE和DELETE命令”選項

  當查詢返回的那些列包含主鍵列(有時幾個列都是主鍵列)時,才能啟用“生成INSERT、UPDATE和DELETE命令”選項。當選擇了“生成INSERT、UPDATE和DELETE命令”選項后,才能選擇“使用開放式并發”選項。當選擇該選項后,就將在UPDATE和DELETE命令里增加WHERE字句,以提供開放式并發控制。現在先不忙選擇“使用開放式并發”選項,我們將在后面的教程里討論如何使SqlDataSource控件實現開放式并發。

  當選擇“生成INSERT、UPDATE和DELETE命令”選項后,點“OK”回到“設置選擇命令”界面,再點下一步,點完成。完成向導后,Visual Studio將會為DetailsView控件增加ProductID, ProductName和UnitPrice三個綁定列(BoundFields),和一個Discontinued單選框列(CheckBoxField )。在DetailsView控件的智能標簽里選擇分頁項,并清空DetailsView的寬、高屬性。

  我們注意到智能標簽里還包括插入、編輯、刪除選項可用,這是因為SqlDataSource控件的InsertCommand, UpdateCommand和DeleteCommand屬性同樣被賦值了。就像如下代碼所示:

asp:DetailsView ID="ManageProducts" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="ProductID"
DataSourceID="ManageProductsDataSource" EnableViewState="False">
Fields>
 asp:BoundField DataField="ProductID" HeaderText="ProductID"
  InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
 asp:BoundField DataField="ProductName" HeaderText="ProductName"
  SortExpression="ProductName" />
 asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
  SortExpression="UnitPrice" />
 asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
  SortExpression="Discontinued" />
/Fields>
/asp:DetailsView>

asp:SqlDataSource ID="ManageProductsDataSource" runat="server"
ConnectionString="%$ ConnectionStrings:NORTHWNDConnectionString %>"
DeleteCommand=
 "DELETE FROM [Products] WHERE [ProductID] = @ProductID"
InsertCommand=
 "INSERT INTO [Products] ([ProductName], [UnitPrice], [Discontinued])
  VALUES (@ProductName, @UnitPrice, @Discontinued)"
SelectCommand=
 "SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
  FROM [Products]"
UpdateCommand=
 "UPDATE [Products] SET [ProductName] = @ProductName,
  [UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued
  WHERE [ProductID] = @ProductID">
DeleteParameters>
 asp:Parameter Name="ProductID" Type="Int32" />
/DeleteParameters>
UpdateParameters>
 asp:Parameter Name="ProductName" Type="String" />
 asp:Parameter Name="UnitPrice" Type="Decimal" />
 asp:Parameter Name="Discontinued" Type="Boolean" />
 asp:Parameter Name="ProductID" Type="Int32" />
/UpdateParameters>
InsertParameters>
 asp:Parameter Name="ProductName" Type="String" />
 asp:Parameter Name="UnitPrice" Type="Decimal" />
 asp:Parameter Name="Discontinued" Type="Boolean" />
/InsertParameters>
/asp:SqlDataSource>

  注意:SqlDataSourc控件是如何自動的為InsertCommand,UpdateCommand和DeleteCommand屬性賦值的。InsertCommand和UpdateCommand屬性里涉及到的列取決于SELECT命令里的列,換句話說,并不是表Products的所有列都出現在InsertCommand和UpdateCommand屬性里。在InsertCommand和UpdateCommand屬性里只能使用SelectCommand返回的那些列(列ProductID除外,因為它是一個IDENTITY列,IDENTITY列的值在編輯的時候不允許改變,而且新插入一條記錄時,自動對IDENTITY列賦值)。另外在InsertCommand, UpdateCommand和 DeleteCommand屬性里出現的每個參數,在DeleteParameters>、UpdateParameters>、InsertParameters>標記里都有對應的參數。

  再轉向DetailsView的數據修改屬性,在智能標簽里啟用插入、編輯、刪除功能。這樣會添加一個CommandField,并將ShowInsertButton、ShowEditButton和 ShowDeleteButton屬性設置為true。

  在瀏覽器訪問該頁,注意到編輯、刪除、新建按鈕出現在DetailsView控件中,點“編輯”按鈕,DetailsView控件將進入編輯模式,那些ReadOnly屬性設置為false(默認)的綁定列將變成一個文本框,而CheckBoxField將變成單選框。


圖9:DetailsView控件的默認編輯界面

  類似的,你可以將當前選定行刪除,或向系統增加新產品記錄。由于InsertCommand語句里只包含ProductName, UnitPrice和Discontinued三列,當完成新增記錄時,其它列要么為NULL要么使用數據庫默認值。和ObjectDataSource控件一樣,假設數據庫表中存在這樣的列,其值不允許為NULL,且未設置默認值,如果在
InsertCommand命令里未包含該列的話,當你試圖執行該INSERT語句的時候將出錯。

  注意:DetailsView控件的默認插入和編輯界面不能實現用戶定制和確認功能,為了能實現用戶定制及添加確認控件,我們需要將綁定列(BoundFields)轉換成模板列(TemplateFields)。獲得更多這方面的信息,請參閱前面的教程Adding Validation Controls to the Editing以及Customizing the Data Modification Interface 。同時謹記,當進行更新和刪除操作時,DetailsView控件將使用當前產品的DataKey值。如果編輯或刪除失敗話,檢查DataKeyNames屬性是否設置正確。

自動生成SQL語句的局限性

  只有當選擇從表返回列時,才能選用“自動生成INSERT, UPDATE和DELETE命令”選項,從而自動生成SQL語句。然而,對更復雜的查詢來說,我們將像第一步那樣手動書寫INSERT, UPDATE和DELETE語句。 一般來說,我們在SQL SELECT命令里使用JOINs將不同表的不同表的數據連接起來(打個比方,我們在顯示產品信息的同時希望顯示供應商名字CategoryName,但是Products表里沒有CategoryName列,那就只有調動表Categories的CategoryName列)。同時我們對“主”表執行編輯、更新和刪除操作(具體到本例,“主”表就是Products表)

  對這種需要手工輸入的比較復雜的查詢,按以下步驟來做可以省時一些。首先,創建一個從表Products返回數據的SqlDataSource控件,在其“設置數據源向導”里選擇“指定來自表或視圖的列”模式來自動地生成INSERT, UPDATE和DELETE語句。完成設置后在屬性窗口打開SelectQuery屬性(或者直接在“設置數據源向導”里選用“自定義SQL語句或存儲過程”模式),最后在SELECT命令里添加JOIN字句。這個方法既有自動生成SQL語句省時的優點,又可以自定義SELECT語句。

  另一個局限性在于,自動生成的INSERT和UPDAT命令里包含的是那些SELECT命令返回的列,而我們實際需要插入或更新的列可能比這些列多也可能比這些列少。比如在第2步中,如果我們要將UnitPrice設置為只讀,那么它就不應該UpdateCommand語句里面, 或者我們希望在新增記錄時對QuantityPerUnit賦值為“TODO”,但在GridView控件里并沒有顯示QuantityPerUnit列。

  對這種情況,我們需要手工輸入代碼。要么直接聲明代碼,要么在“設置數據源向導”里選擇“指定SQL語句或存儲過程”模式,要么通過屬性窗口設置。

  注意:當新增一個參數時,如果在數據Web控件里沒有與該參數對應的列話,我們應通過其他方法對該參數賦值:在InsertCommand和UpdateCommand語句里通過硬編碼賦值;通過預定義源(比如查詢字符串、session狀態,頁面上的控件等)傳遞參數;通過編程對參數賦值。

總結:

  要使數據Web控件能啟用其內建的插入、編輯、刪除功能,它綁定的數據源控件首先要提供這些功能函數。對SqlDataSource來說,就是其InsertCommand, UpdateCommand和DeleteCommand屬性必須包含INSERT,UPDATE和DELETE語句。在本節教程我們探討了手工和自動2種生成代碼的方法。

  祝編程快樂!

作者簡介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用 微軟Web技術。大家可以點擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數據教程》,希望對大家的學習ASP.NET有所幫助。

您可能感興趣的文章:
  • 讓Win2008+IIS7+ASP.NET支持10萬并發請求
  • c#實現服務器性能監控并發送郵件保存日志
  • C#線程執行超時處理與并發線程數控制實例
  • c#編寫的高并發數據庫控制訪問代碼
  • C#使用隊列(Queue)解決簡單的并發問題
  • 在ASP.NET 2.0中操作數據之二十一:實現開放式并發
  • 在ASP.NET 2.0中操作數據之四十四:DataList和Repeater數據排序(三)
  • 在ASP.NET 2.0中操作數據之四十五:DataList和Repeater里的自定義Button
  • 在ASP.NET 2.0中操作數據之四十六:使用SqlDataSource控件檢索數據
  • 在ASP.NET 2.0中操作數據之四十八:對SqlDataSource控件使用開放式并發

標簽:聊城 海西 甘肅 清遠 平涼 中衛 臨夏 慶陽

巨人網絡通訊聲明:本文標題《在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據》,本文關鍵詞  在,ASP.NET,2.0,中,操作,數據,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據》相關的同類信息!
  • 本頁收集關于在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據的相關信息資訊供網民參考!
  • 推薦文章
    国产一区二区精品久久91| 日韩中文字幕在线观看视频| 国产福利免费视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲精品影院久久久久久| 免费国产在线观看| 国产高清在线精品一区二区| 国产激情视频在线观看| 精品国产一区二区三区久久久蜜臀| 高清一级毛片一本到免费观看| 天天色成人| a级黄色毛片免费播放视频| 午夜欧美福利| 精品视频一区二区三区免费| 久久久久久久免费视频| 99色视频在线| 国产不卡在线播放| 高清一级毛片一本到免费观看| 精品国产亚一区二区三区| 四虎影视久久久| 久久国产一区二区| 久久国产精品只做精品| 日本特黄特色aaa大片免费| 一本伊大人香蕉高清在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 毛片高清| 欧美大片a一级毛片视频| 亚洲女人国产香蕉久久精品 | 久久精品店| 台湾毛片| 国产a免费观看| 日本伦理黄色大片在线观看网站| 免费的黄色小视频| 高清一级做a爱过程不卡视频| 99久久精品费精品国产一区二区| 国产高清视频免费| 国产一区二区精品久久91| 在线观看导航| 二级片在线观看| 精品视频在线观看免费| 亚欧成人毛片一区二区三区四区| 国产a视频| 色综合久久天天综合| 二级特黄绝大片免费视频大片| 成人影院久久久久久影院| 亚洲wwwwww| 尤物视频网站在线| 国产美女在线一区二区三区| 国产视频一区二区在线播放| 免费的黄色小视频| 国产视频一区二区三区四区| 97视频免费在线观看| 国产不卡精品一区二区三区| 韩国三级视频在线观看| 精品国产一区二区三区精东影业| 欧美1卡一卡二卡三新区| 日本在线不卡免费视频一区| 国产国语在线播放视频| 国产亚洲精品成人a在线| 欧美a免费| 久久99中文字幕久久| 国产成人精品影视| 你懂的在线观看视频| a级精品九九九大片免费看| 日本免费看视频| 久久国产精品只做精品| 精品视频免费看| 国产亚洲精品aaa大片| 国产不卡精品一区二区三区| 国产视频网站在线观看| 国产一区二区精品在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 美女免费精品高清毛片在线视| 黄色短视屏| 深夜做爰性大片中文| 久久精品店| 91麻豆精品国产片在线观看| 国产伦理精品| 成人影院一区二区三区| 精品视频在线观看一区二区| 欧美国产日韩一区二区三区| 免费一级生活片| 久久久久久久久综合影视网| 美女免费精品高清毛片在线视| 沈樵在线观看福利| 精品国产一区二区三区免费| 日韩在线观看视频黄| 国产亚洲精品aaa大片| 免费国产在线观看不卡| 99久久精品国产国产毛片 | 国产亚洲精品aaa大片| 国产视频一区二区在线播放| 一级片免费在线观看视频| 亚欧乱色一区二区三区| 国产91精品一区二区| 国产网站免费在线观看| 亚洲精品中文字幕久久久久久| 99久久精品国产免费| 九九九网站| 国产不卡高清在线观看视频| 欧美激情一区二区三区在线| 国产伦理精品| 国产视频一区二区在线观看| 夜夜操网| 九九精品在线播放| 精品美女| 久久国产精品只做精品| 尤物视频网站在线| 久久久久久久久综合影视网| 精品国产亚洲人成在线| 免费国产在线观看| 国产伦精品一区二区三区在线观看| 亚洲第一视频在线播放| 青青青草影院 | 精品久久久久久中文| 黄视频网站免费看| 四虎影视久久久| 高清一级毛片一本到免费观看| 可以免费看污视频的网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产91视频网| 国产麻豆精品hdvideoss| 国产a视频| 九九久久99| 国产伦理精品| 国产精品自拍在线观看| 九九久久99综合一区二区| 亚洲精品影院| 国产高清在线精品一区二区| 一级片片| 国产激情一区二区三区| 国产视频一区二区在线观看| 免费国产在线观看不卡| 成人高清视频免费观看| 亚洲精品影院| 麻豆网站在线免费观看| 欧美激情一区二区三区在线| 久久国产影院| 国产高清视频免费观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产高清视频免费观看| 久久久久久久网| 精品久久久久久影院免费| 欧美a级片视频| 久久国产精品只做精品| 尤物视频网站在线| 99色视频在线观看| 欧美电影免费| 精品久久久久久免费影院| 日本乱中文字幕系列| 天天做日日干| 国产一级生活片| 色综合久久久久综合体桃花网| 精品国产一区二区三区久久久狼 | 美女免费毛片| 成人免费一级毛片在线播放视频| 国产91丝袜高跟系列| 久草免费在线视频| 国产视频久久久久| 精品久久久久久中文| 欧美a级片视频| 日韩一级精品视频在线观看| 亚洲天堂免费| 四虎影视久久久| 四虎久久影院| 国产原创中文字幕| 精品久久久久久中文字幕2017| 亚洲女初尝黑人巨高清在线观看| 韩国毛片 免费| 日韩免费片| 亚洲精品久久久中文字| 成人免费一级毛片在线播放视频| 91麻豆国产福利精品| 久久精品免视看国产成人2021| 超级乱淫黄漫画免费| 韩国毛片免费大片| 国产高清在线精品一区二区| 美国一区二区三区| 青草国产在线| 久草免费在线观看| 久久久久久久免费视频| 久久99中文字幕| 黄色免费网站在线| 日韩一级精品视频在线观看| 一级毛片视频播放| 精品国产一区二区三区久久久蜜臀 | 久久99中文字幕| 色综合久久天天综合绕观看| 精品国产亚洲人成在线| 精品视频在线观看一区二区| 久久国产精品自由自在| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品久久久久久中文字幕一区| 色综合久久久久综合体桃花网| 欧美激情一区二区三区视频| 久久久久久久网| 麻豆系列国产剧在线观看| 四虎久久精品国产| a级毛片免费观看网站| 久久久成人网|