校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > SQL數據庫存儲過程示例解析

SQL數據庫存儲過程示例解析

熱門標簽:濮陽清豐400開頭的電話申請 南通智能外呼系統怎么樣 疫情時期電話機器人 臺灣外呼系統軟件 南京怎么申請400這種電話 地圖標注跑線下市場 地圖標注可以編輯地名嗎 真3地圖標注 樂昌電話機器人

什么是存儲過程:存儲過程可以說是一個記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調用他就行了。

存儲過程的好處:

1.由于數據庫執行動作時,是先編譯后執行的。然而存儲過程是一個編譯過的代碼塊,所以執行效率要比T-SQL語句高。

2.一個存儲過程在程序在網絡中交互時可以替代大堆的T-SQL語句,所以也能降低網絡的通信量,提高通信速率。

3.通過存儲過程能夠使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。

小結:總之存儲過程是好東西,在做項目時屬于必備利器,下面介紹存儲過程的基本語法。

存儲過程的語法和參數講解

存儲過程的一些基本語法:

--------------創建存儲過程-----------------

CREATE PROC [ EDURE ] procedure_name [ ; number ]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [ ,...n ]

[ WITH
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

--------------調用存儲過程-----------------

EXECUTE Procedure_name '' --存儲過程如果有參數,后面加參數格式為:@參數名=value,也可直接為參數值value

--------------刪除存儲過程-----------------

drop procedure procedure_name  --在存儲過程中能調用另外一個存儲過程,而不能刪除另外一個存儲過程

創建存儲過程的參數:
1.procedure_name :存儲過程的名稱,在前面加#為局部臨時存儲過程,加##為全局臨時存儲過程。

2.; number:是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在 procedure_name 前后使用適當的定界符。

3.@parameter: 存儲過程的參數。可以有一個或多個。用戶必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多可以有 2.100 個參數。
使用 @ 符號作為第一個字符來指定參數名稱。參數名稱必須符合標識符的規則。每個過程的參數僅用于該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用于代替表名、列名或其它數據庫對象的名稱。有關更多信息,請參見 EXECUTE。

4.data_type:參數的數據類型。所有數據類型(包括 text、ntext 和 image)均可以用作存儲過程的參數。不過,cursor 數據類型只能用于 OUTPUT 參數。如果指定的數據類型為 cursor,也必須同時指定 VARYING 和 OUTPUT 關鍵字。有關 SQL Server 提供的數據類型及其語法的更多信息,請參見數據類型。
說明 對于可以是 cursor 數據類型的輸出參數,沒有最大數目的限制。

5.VARYING: 指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用于游標參數。

6.default: 參數的默認值。如果定義了默認值,不必指定該參數的值即可執行過程。默認值必須是常量或 NULL。如果過程將對該參數使用 LIKE 關鍵字,那么默認值中可以包含通配符(%、_、[] 和 [^])。

7.OUTPUT :表明參數是返回參數。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。Text、ntext 和 image 參數可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是游標占位符。

8.RECOMPILE: 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。

9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復制的一部分發布。 說明 在升級過程中,SQL Server 利用存儲在 syscomments 中的加密注釋來重新創建加密過程。

10.FOR REPLICATION :指定不能在訂閱服務器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。

11.AS :指定過程要執行的操作。

12.sql_statement :過程中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。

小結:看過這些基本語法后,下面我就根據語法創建各式的存儲過程。

 創建存儲過程

 

針對上面的表,我使用存儲過程對它做一些操作:

1. 只返回單一記錄集的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------
create Procedure GetUserAccount
as
select * from UserAccount
go

-------------執行上面的存儲過程----------------
exec GetUserAccount

結果:相當于運行 select * from UserAccount 這行代碼,結果為整個表的數據。

2.沒有輸入輸出的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure inUserAccount
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)
go

-------------執行上面的存儲過程----------------

exec inUserAccount

結果:相當于運行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 這行代碼。

3.有返回值的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure inUserAccountRe
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec inUserAccountRe

解釋:這里的@@rowcount為執行存儲過程影響的行數,執行的結果是不僅插入了一條數據,還返回了一個值即 return value =1  ,這個可以在程序中獲取,稍后在c#調用存儲過程中會有說到。

4.有輸入參數和輸出參數的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe '7',null

解釋:@UserName為輸入參數,@UserID為輸出參數。 運行結果為@userID為COOUT(*)即 =1。

5. 同時具有返回值、輸入參數、輸出參數的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe1
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe1 '7',null

結果:@userID為COOUT(*)即 =1,Retun Value=1。

6.同時返回參數和記錄集的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe2
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
select * from UserAccount
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe2 '7',null

結果:返回執行 select * from UserAccount 這句代碼的結果集,同時@userID為COOUT(*)即 =1,Retun Value=9。

7.返回多個記錄集的存儲過程

-------------創建名為GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe3
as
select * from UserAccount
select * from UserAccount where UserID>5
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe3

結果:返回兩個結果集,一個為 select * from UserAccount,另一個為 select * from UserAccount where UserID>5 。

小結:上面我們創建了各式的存儲過程,下面看我們在c#中怎樣調用這些存儲過程。

C#調用存儲過程

這里調用的存儲過程為上面我寫的那些各式各樣的存儲過程。

public partial class ProcedureTest : System.Web.UI.Page
  {
    public static string conn = ConfigurationManager.ConnectionStrings["StuRelationDBConnectionString"].ConnectionString;
    public SqlConnection con = new SqlConnection(conn);
    protected void Page_Load(object sender, EventArgs e)
    {
      runGetUserAccountRe3();
    }

    //只返回單一記錄集的存儲過程GetUserAccount
    public void runGetUserAccount()
    {
      SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount"));
      DataSet ds = new DataSet();
      // 填充dataset 
      dp.Fill(ds);
      rpt.DataSource = ds;
      rpt.DataBind();

    }

    //沒有輸入輸出的存儲過程inUserAccount
    public void runinUserAccount()
    {      
      con.Open();
      Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();
      con.Close();
    }

    //有返回值的存儲過程inUserAccountRe
    public void runinUserAccountRe()
    {
      // 創建參數 
      SqlCommand cmd = common("inUserAccountRe");
      IDataParameter[] parameters = { 
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      // 將參數類型設置為 返回值類型 
      parameters[0].Direction = ParameterDirection.ReturnValue;
      // 添加參數 
      cmd.Parameters.Add(parameters[0]);
      con.Open();
      // 執行存儲過程并返回影響的行數 
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();
      // 顯示影響的行數和返回值 
      Label1.Text += "-" + parameters[0].Value.ToString();
    }

    //有輸入參數和輸出參數的存儲過程
    public void runGetUserAccountRe()
    {
      SqlCommand cmd = common("GetUserAccountRe");
      // 創建參數 
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
       };
      // 設置參數類型 
      parameters[0].Value = "7"; 
      parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數 
      // 添加參數 
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      con.Open();
      // 執行存儲過程并返回影響的行數 
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();      
      // 顯示影響的行數和輸出參數 
      Label1.Text += "-" + parameters[1].Value.ToString();
      
    }

    //同時具有返回值、輸入參數、輸出參數的存儲過程GetUserAccountRe1
    public void runGetUserAccountRe1()
    {
      SqlCommand cmd = common("GetUserAccountRe1");
      // 創建參數 
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      // 設置參數類型 
      parameters[0].Value = "7";
      parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數 
      parameters[2].Direction = ParameterDirection.ReturnValue; //設置為返回值
      // 添加參數 
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      cmd.Parameters.Add(parameters[2]);
      con.Open();
      // 執行存儲過程并返回影響的行數 
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      con.Close();
      // 顯示影響的行數和輸出參數 
      Label1.Text += "-輸出參數為:" + parameters[1].Value.ToString();
      Label1.Text += "-返回值為:" + parameters[2].Value.ToString();

    }

    //同時返回參數和記錄集的存儲過程GetUserAccountRe2
    public void runGetUserAccountRe2()
    {
      SqlCommand cmd = common("GetUserAccountRe2");
      // 創建參數 
      IDataParameter[] parameters = { 
         new SqlParameter("@UserName", SqlDbType.NChar,20) , 
         new SqlParameter("@UserID", SqlDbType.Int) ,
         new SqlParameter("rval", SqlDbType.Int,4) 
       };
      // 設置參數類型 
      parameters[0].Value = "7";
      parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數 
      parameters[2].Direction = ParameterDirection.ReturnValue; //設置為返回值
      // 添加參數 
      cmd.Parameters.Add(parameters[0]);
      cmd.Parameters.Add(parameters[1]);
      cmd.Parameters.Add(parameters[2]);
      con.Open();
      // 執行存儲過程并返回影響的行數 
      Label1.Text = cmd.ExecuteNonQuery().ToString();
      DataSet ds = new DataSet();
      SqlDataAdapter dt = new SqlDataAdapter(cmd);
      dt.Fill(ds);
      rpt.DataSource = ds;
      rpt.DataBind();
      con.Close();
      // 顯示影響的行數和輸出參數 
      Label1.Text += "-輸出參數為:" + parameters[1].Value.ToString();
      Label1.Text += "-返回值為:" + parameters[2].Value.ToString();

    }

    //返回多個記錄集的存儲過程
    public void runGetUserAccountRe3()
    {
      DataSet ds = new DataSet();
      SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3"));
      dt.Fill(ds);
      rpt1.DataSource = ds.Tables[0].DefaultView;
      rpt1.DataBind();
      rpt2.DataSource = ds.Tables[1].DefaultView;
      rpt2.DataBind();
    }
    
    public SqlCommand common(string proName)
    {
      
      SqlCommand cmd = new SqlCommand();
      // 設置sql連接 
      cmd.Connection = con;      
      // 如果執行語句 
      cmd.CommandText = proName;
      // 指定執行語句為存儲過程 
      cmd.CommandType = CommandType.StoredProcedure;
      return cmd;
    }
  }

附帶SQLServer數據庫的一些全局變量

select APP_NAME ( ) as w --當前會話的應用程序

select @@IDENTITY  --返回最后插入的標識值 
select USER_NAME()  --返回用戶數據庫用戶名

SELECT @@CONNECTIONS --返回自上次SQL啟動以來連接或試圖連接的次數。 
SELECT GETDATE() --當前時間 
SELECT @@CPU_BUSY/100 --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒

USE tempdb SELECT @@DBTS as w --為當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。 
select @@IDENTITY as w --返回最后插入的標識值 
SELECT @@IDLE as w --返回SQL自上次啟動后閑置的時間,單位為毫秒 
SELECT @@IO_BUSY AS w  --返回SQL自上次啟動后用于執行輸入和輸出操作的時間,單位為毫秒 
SELECT @@LANGID AS w  --返回當前所使用語言的本地語言標識符(ID)。 
SELECT @@LANGUAGE AS w  --返回當前使用的語言名 
SELECT @@LOCK_TIMEOUT as w --當前會話的當前鎖超時設置,單位為毫秒。 
SELECT @@MAX_CONNECTIONS as w --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值 
EXEC sp_configure --顯示當前服務器的全局配置設置 
SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 數據類型所用的精度級別,即該服務器中當前設置的精度。默認最大精度38。 
select @@OPTIONS as w --返回當前 SET 選項的信息。 
SELECT @@PACK_RECEIVED as w --返回SQL自啟動后從網絡上讀取的輸入數據包數目。 
SELECT @@PACK_SENT as w --返回SQ自上次啟動后寫到網絡上的輸出數據包數目。 
SELECT @@PACKET_ERRORS as w --返回自SQL啟動后,在SQL連接上發生的網絡數據包錯誤數。 
SELECT @@SERVERNAME as w --返回運行SQL服務器名稱。 
SELECT @@SERVICENAME as w --返回SQL正在其下運行的注冊表鍵名 
SELECT @@TIMETICKS as w --返回SQL服務器一刻度的微秒數 
SELECT @@TOTAL_ERRORS AS w --返回 SQL服務器自啟動后,所遇到的磁盤讀/寫錯誤數。 
SELECT @@TOTAL_READ as w --返回 SQL服務器自啟動后讀取磁盤的次數。 
SELECT @@TOTAL_WRITE as w --返回SQL服務器自啟動后寫入磁盤的次數。 
SELECT @@TRANCOUNT as w --返回當前連接的活動事務數。 
SELECT @@VERSION as w --返回SQL服務器安裝的日期、版本和處理器類型。 

以上就是本文的全部內容,希望對大家的學習有所幫助。

您可能感興趣的文章:
  • 一個查看MSSQLServer數據庫空間使用情況的存儲過程 SpaceUsed
  • sqlserver 復制表 復制數據庫存儲過程的方法
  • sql 判斷數據庫,表,存儲過程等是否存在的代碼
  • mysql 查詢數據庫中的存儲過程與函數的語句
  • SQLserver 數據庫危險存儲過程刪除與恢復方法
  • MSSQL MySQL 數據庫分頁(存儲過程)
  • SQL Server中通過擴展存儲過程實現數據庫的遠程備份與恢復
  • mysql 導入導出數據庫以及函數、存儲過程的介紹
  • sqlSQL數據庫怎么批量為存儲過程/函數授權呢?
  • MSSQL監控數據庫的DDL操作(創建,修改,刪除存儲過程,創建,修改,刪除表等)

標簽:阿里 陜西 馬鞍山 福建 河北 通遼 南京 廣安

巨人網絡通訊聲明:本文標題《SQL數據庫存儲過程示例解析》,本文關鍵詞  SQL,數據庫,存儲,過程,示例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL數據庫存儲過程示例解析》相關的同類信息!
  • 本頁收集關于SQL數據庫存儲過程示例解析的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产日韩欧美高清在线| 欧美一区欧美二区| 蜜桃在线一区二区三区| 欧美国产精品一区二区三区| 欧美日韩在线亚洲一区蜜芽| 国产成人综合亚洲91猫咪| 亚洲v精品v日韩v欧美v专区| 国产精品全国免费观看高清| 日韩欧美一二三四区| 欧美三级日韩三级| 菠萝蜜视频在线观看一区| 人人爽香蕉精品| 一级日本不卡的影视| 中文字幕精品一区二区精品绿巨人 | 中文字幕精品一区二区精品绿巨人| 欧美一区二区三区在线看 | 欧美xingq一区二区| 欧美日韩性生活| 91网站最新网址| 国产a视频精品免费观看| 久久精品国产网站| 蜜桃久久精品一区二区| 丝袜亚洲精品中文字幕一区| 一区二区三区毛片| 亚洲欧美偷拍另类a∨色屁股| 国产精品美女久久久久高潮| 久久精品一区二区三区不卡| 日韩欧美国产麻豆| 日韩亚洲欧美高清| 这里只有精品视频在线观看| 欧美日韩国产美女| 在线观看亚洲精品视频| 一本色道久久综合亚洲aⅴ蜜桃 | 黑人巨大精品欧美黑白配亚洲| 毛片一区二区三区| 美女久久久精品| 狠狠狠色丁香婷婷综合激情| 国产一区二区三区蝌蚪| 国产一区二区三区免费观看| 国产一区二区不卡| 成人一区二区在线观看| 成人网在线免费视频| 波多野结衣一区二区三区 | 91蜜桃免费观看视频| 99久久免费精品高清特色大片| hitomi一区二区三区精品| bt7086福利一区国产| 91最新地址在线播放| 日本丰满少妇一区二区三区| 欧美色图一区二区三区| 欧美日本一区二区| 日韩精品一区二区三区四区视频 | 在线观看一区二区视频| 欧美精品久久一区| 精品国产一区二区三区忘忧草| 久久综合视频网| 国产精品免费观看视频| 亚洲欧美在线观看| 亚洲一区在线播放| 奇米色一区二区| 国产激情一区二区三区| 91色婷婷久久久久合中文| 欧美日韩久久久| 久久久综合激的五月天| 亚洲色图在线看| 午夜精品久久久久久久久久| 麻豆精品国产91久久久久久| 国产福利一区二区三区视频在线 | 国产精品麻豆久久久| 亚洲六月丁香色婷婷综合久久 | 欧美男人的天堂一二区| 欧美videofree性高清杂交| 国产日产欧美一区| 亚洲最色的网站| 久久国产欧美日韩精品| 97精品视频在线观看自产线路二| 欧美精选一区二区| 欧美国产禁国产网站cc| 亚洲一区在线观看视频| 国产精品伊人色| 欧美午夜精品一区| 久久久久久久久一| 亚洲午夜免费电影| 国产乱国产乱300精品| 欧美在线free| 久久婷婷国产综合精品青草| 亚洲欧美日韩中文字幕一区二区三区| 日韩高清不卡在线| 99精品视频中文字幕| 日韩美女主播在线视频一区二区三区 | 日韩欧美二区三区| 亚洲激情av在线| 国产精品一区久久久久| 欧美精品亚洲一区二区在线播放| 中文在线免费一区三区高中清不卡| 午夜天堂影视香蕉久久| 成人丝袜视频网| 日韩精品一区二区三区swag| 亚洲视频香蕉人妖| 国产成人超碰人人澡人人澡| 91麻豆精品国产| 一区二区三区欧美激情| 国产精品自拍一区| 91精品国产综合久久久久久久久久 | 国产一区欧美二区| 8x福利精品第一导航| 亚洲嫩草精品久久| 成人av在线看| 2023国产精品| 美美哒免费高清在线观看视频一区二区| 色呦呦网站一区| 国产精品久久久久久妇女6080| 美日韩一区二区| 91精品国产综合久久婷婷香蕉| 亚洲永久精品大片| 日本道精品一区二区三区 | 亚瑟在线精品视频| 在线观看日韩国产| 亚洲日本丝袜连裤袜办公室| 丁香婷婷深情五月亚洲| 久久综合五月天婷婷伊人| 久色婷婷小香蕉久久| 欧美一区二区精品| 日韩高清一区在线| 欧美一区二区三区免费| 日韩精品国产欧美| 91精品国产综合久久久久久久 | 91久久免费观看| 日韩毛片精品高清免费| 97se亚洲国产综合自在线不卡 | 日韩中文欧美在线| 欧美精品乱人伦久久久久久| 婷婷成人激情在线网| 欧美午夜精品电影| 亚洲va国产天堂va久久en| 欧美日韩情趣电影| 视频一区在线视频| 欧美一区二区福利视频| 男人操女人的视频在线观看欧美 | 亚洲毛片av在线| 91丨九色丨国产丨porny| 亚洲视频网在线直播| 欧洲国内综合视频| 性做久久久久久久免费看| 在线不卡一区二区| 午夜电影一区二区三区| 欧美日韩成人综合在线一区二区| 午夜影院久久久| 日韩一区二区在线免费观看| 黑人精品欧美一区二区蜜桃| 国产日韩v精品一区二区| 成人av在线一区二区三区| 亚洲视频一区在线观看| 欧美日韩日日夜夜| 另类小说一区二区三区| 国产欧美中文在线| 一本久道久久综合中文字幕| 亚洲一区二区高清| 日韩欧美一二三区| 成人在线视频一区二区| 亚洲美女在线一区| 91精品久久久久久久久99蜜臂| 国产一区二区日韩精品| 自拍偷自拍亚洲精品播放| 欧美在线free| 国产一区二区在线看| 亚洲婷婷在线视频| 欧美久久久久免费| 国产东北露脸精品视频| 亚洲线精品一区二区三区| 精品少妇一区二区| 99久久免费视频.com| 日韩不卡一区二区| 国产精品久久久久久久裸模| 欧美日韩第一区日日骚| 成人中文字幕电影| 日本网站在线观看一区二区三区| 久久久久久久久久久久久夜| 色悠久久久久综合欧美99| 老司机精品视频在线| 亚洲欧美激情插| 亚洲精品在线电影| 欧洲生活片亚洲生活在线观看| 精品一区二区三区av| 一区二区三区中文字幕电影 | 国产精品12区| 视频一区欧美精品| 国产精品免费网站在线观看| 91精品在线麻豆| 99久久777色| 国产一区二区三区黄视频| 亚洲一区在线观看免费观看电影高清| 337p日本欧洲亚洲大胆色噜噜| 色屁屁一区二区| 国产精品综合av一区二区国产馆| 亚洲国产视频一区| 亚洲欧美影音先锋| 久久久久青草大香线综合精品| 欧美精品aⅴ在线视频| 91网站最新网址|