《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于C#的數(shù)據(jù)庫(kù)表結(jié)構(gòu)報(bào)表系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
基于C#的數(shù)據(jù)庫(kù)表結(jié)構(gòu)報(bào)表系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
來(lái)源:微型機(jī)與應(yīng)用2013年第21期
歐 微,程 嵐,陳圣榮
(烏魯木齊民族干部學(xué)院,新疆 烏魯木齊 830002)
摘要: 為便于團(tuán)隊(duì)交流與系統(tǒng)維護(hù),在對(duì)表的設(shè)計(jì)結(jié)構(gòu)修改后,應(yīng)及時(shí)更新項(xiàng)目技術(shù)文檔。為克服現(xiàn)有方法存在的不足,在Visual Studio 2010環(huán)境下,基于C#編程語(yǔ)言,開(kāi)發(fā)了一個(gè)針對(duì)SQL Server數(shù)據(jù)庫(kù)表結(jié)構(gòu)的報(bào)表生成系統(tǒng)。該系統(tǒng)支持單表導(dǎo)出和批量導(dǎo)出兩種工作模式,支持將表結(jié)構(gòu)導(dǎo)出到Word和Excel兩種應(yīng)用接口,具有操作簡(jiǎn)單、使用靈活和功能完善的優(yōu)點(diǎn),對(duì)提高團(tuán)隊(duì)開(kāi)發(fā)效率和技術(shù)文檔的規(guī)范性具有一定的應(yīng)用價(jià)值。
Abstract:
Key words :

摘  要: 為便于團(tuán)隊(duì)交流與系統(tǒng)維護(hù),在對(duì)表的設(shè)計(jì)結(jié)構(gòu)修改后,應(yīng)及時(shí)更新項(xiàng)目技術(shù)文檔。為克服現(xiàn)有方法存在的不足,在Visual Studio 2010環(huán)境下,基于C#編程語(yǔ)言,開(kāi)發(fā)了一個(gè)針對(duì)SQL Server數(shù)據(jù)庫(kù)表結(jié)構(gòu)的報(bào)表生成系統(tǒng)。該系統(tǒng)支持單表導(dǎo)出和批量導(dǎo)出兩種工作模式,支持將表結(jié)構(gòu)導(dǎo)出到Word和Excel兩種應(yīng)用接口,具有操作簡(jiǎn)單、使用靈活和功能完善的優(yōu)點(diǎn),對(duì)提高團(tuán)隊(duì)開(kāi)發(fā)效率和技術(shù)文檔的規(guī)范性具有一定的應(yīng)用價(jià)值。
關(guān)鍵詞: SQL Server數(shù)據(jù)庫(kù);表設(shè)計(jì)結(jié)構(gòu);報(bào)表生成

 數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)主要包括需求分析、概念結(jié)構(gòu)、邏輯結(jié)構(gòu)和物理結(jié)構(gòu)設(shè)計(jì)等多個(gè)階段,是一個(gè)反復(fù)探索、逐步求精的過(guò)程[1-2]。優(yōu)化存儲(chǔ)結(jié)構(gòu)、提高查詢(xún)效率,確保數(shù)據(jù)的準(zhǔn)確性、一致性與完整性,在數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)時(shí),需頻繁地對(duì)表結(jié)構(gòu)進(jìn)行論證、修訂和優(yōu)化[3-4]。為方便團(tuán)隊(duì)交流與系統(tǒng)維護(hù),表的邏輯結(jié)構(gòu)說(shuō)明是數(shù)據(jù)庫(kù)項(xiàng)目技術(shù)文檔不可或缺的內(nèi)容,因此在對(duì)表的設(shè)計(jì)結(jié)構(gòu)修改后,應(yīng)及時(shí)更新表設(shè)計(jì)結(jié)構(gòu)的說(shuō)明文檔,其實(shí)現(xiàn)方法通常有兩種:一是借助數(shù)據(jù)庫(kù)設(shè)計(jì)工具(Rose、Power Designer等)導(dǎo)出設(shè)計(jì)結(jié)構(gòu)報(bào)表,該方法集成度高且生成技術(shù)文檔相對(duì)規(guī)范,但在進(jìn)入編碼開(kāi)發(fā)階段后,再對(duì)表的邏輯結(jié)構(gòu)修訂完善,往往只需對(duì)個(gè)別表設(shè)計(jì)結(jié)構(gòu)的小幅變更,由于模板定制復(fù)雜且流程性過(guò)強(qiáng),該方法的適用性與靈活性受到局限。二是在表結(jié)構(gòu)修改后,采用手工修訂的方法調(diào)整開(kāi)發(fā)文檔中的相應(yīng)內(nèi)容,該方法靈活性高,但工作繁瑣,且難以確保對(duì)表結(jié)構(gòu)描述的一致性[5-6]。
 本文在Visual Studio 2010開(kāi)發(fā)環(huán)境下,利用C#編程語(yǔ)言,針對(duì)SQL Server數(shù)據(jù)庫(kù)環(huán)境,開(kāi)發(fā)了一個(gè)針對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的報(bào)表生成系統(tǒng)。該系統(tǒng)支持兩種工作模式:即單表模式和批量模式。顧名思義,在單表模式下,用戶(hù)通過(guò)一次操作可導(dǎo)出某個(gè)指定表格的設(shè)計(jì)結(jié)構(gòu);在批量模式下,系統(tǒng)支持一次導(dǎo)出數(shù)據(jù)庫(kù)中的全部或多個(gè)表格的結(jié)構(gòu)屬性。同時(shí),系統(tǒng)提供了相應(yīng)接口,用戶(hù)可根據(jù)需要將相應(yīng)數(shù)據(jù)導(dǎo)出到Word或Excel文檔中。限于篇幅,本文主要通過(guò)單表工作模式,介紹該系統(tǒng)的功能結(jié)構(gòu)、實(shí)現(xiàn)方法及工作流程。
1 系統(tǒng)實(shí)現(xiàn)
 系統(tǒng)的用戶(hù)主界面如圖1所示,該系統(tǒng)主要包括數(shù)據(jù)庫(kù)連接模塊、屬性選擇模塊、設(shè)計(jì)結(jié)構(gòu)輸出模塊、數(shù)據(jù)導(dǎo)出模塊等4部分。

1.1 數(shù)據(jù)庫(kù)連接模塊
 數(shù)據(jù)庫(kù)連接模塊用于與數(shù)據(jù)庫(kù)建立連接,讀取并輸出數(shù)據(jù)中包含的所有表的名稱(chēng)。其中實(shí)現(xiàn)過(guò)程可描述為:(1)根據(jù)用戶(hù)輸入的服務(wù)器地址、數(shù)據(jù)庫(kù)名稱(chēng)、用戶(hù)名及密碼,驗(yàn)證其是否正確,確保連接成功;(2)在連接成功后,讀取數(shù)據(jù)中所包含的表,當(dāng)操作模式批量導(dǎo)出時(shí),輸出到CheckedListBox復(fù)選列表框;當(dāng)操作模式為單表導(dǎo)出時(shí),輸出到下拉列表,其關(guān)鍵代碼下:
cShowTableStructure sts=new cShowTableStructure();
sts.connStr=String.Format("server={0};database={1};
uid={2};pwd={3}",
serverName,dBaseName,userId,userPwd);//連接字符串
sts.sqlStr=String.Format("select*from+{0}.dbo.sysobjects
 where xtype=′U′
order by name asc",dBaseName);//查詢(xún)語(yǔ)句
DataTable dtable=sts.mReadTableInfors();
//讀取數(shù)據(jù)庫(kù)中的表名,返回一個(gè)DataTable
if(dtable =null)
{
   MessageBox.Show("連接成功,請(qǐng)選擇表格!");
   //將表格名稱(chēng)添加為下拉列表的Items
   for(int i=0;i<=dtable.Rows.Count-1;i++)
   {
      string tName=dtable.Rows[i][0].ToString();
      cmb_TableName.Items.Add(tName);
      cmb_TableName.SelectedIndex=0;
    }
   btnChooseTable.Enabled=true;//允許用戶(hù)提交選擇項(xiàng)
 }
else{……}
1.2 屬性選擇模塊
 在用戶(hù)建立表的過(guò)程中,數(shù)據(jù)庫(kù)管理系統(tǒng)將保存表設(shè)計(jì)結(jié)構(gòu)的信息,包括字段名、數(shù)據(jù)類(lèi)型、長(zhǎng)度、默認(rèn)值及字段說(shuō)明等。為方便用戶(hù)進(jìn)行選擇,通過(guò)類(lèi)型為CheckBox的數(shù)組ckBoxs,呈現(xiàn)在表設(shè)計(jì)的常用屬性,供用戶(hù)選擇。其中,序號(hào)與字段名為必選項(xiàng),其他信息用戶(hù)根據(jù)需要進(jìn)行選擇,默認(rèn)為全選。通過(guò)條件選擇語(yǔ)句對(duì)SQL查詢(xún)語(yǔ)句的組合,實(shí)現(xiàn)對(duì)用戶(hù)所關(guān)心屬性的選擇性輸出,其關(guān)鍵代碼如下:
//根據(jù)用戶(hù)選擇的屬性,控制SQL查詢(xún)的輸出字段
string sqlstr="Select";
if(ckBoxs[0].Checked){sqlstr+="a.colorder N′序號(hào)′,";}
if(ckBoxs[1].Checked){sqlstr+="a.name N′字段名′,";}
if(ckBoxs[2].Checked){sqlstr+="(case when
COLUMNPROPERTY(a.id,a.name,
′IsIdentity′)=1 then′√¨?′else′′end)N′是否標(biāo)識(shí)′,";}
…… ……
if(ckBoxs[9].Checked){sqlstr+="isnull(e.text,′′)N′默認(rèn)值′,";}
if(ckBoxs[10].Checked){sqlstr+="isnull(g.[value],′′)AS N′字段說(shuō)明′,";}
//去掉語(yǔ)句最后一個(gè)逗號(hào),保證查詢(xún)語(yǔ)句的正確性
sqlstr=sqlstr.Remove(sqlstr.LastIndexOf(′,′),1);
1.3 表結(jié)構(gòu)輸出模塊
 屬性選擇模塊實(shí)現(xiàn)對(duì)輸出字段與查詢(xún)條件的控制,生成了相應(yīng)的SQL查詢(xún)語(yǔ)句。表設(shè)計(jì)結(jié)構(gòu)輸出模塊的任務(wù)是利用已有的查詢(xún)語(yǔ)句,訪問(wèn)數(shù)據(jù)庫(kù)并讀取表設(shè)計(jì)信息,然后輸出到用戶(hù)界面,其關(guān)鍵代碼如下:
cShowTableStructure sts=new cShowTableStructure()
{sqlStr=sqlstr,connStr=connstr};
DataTable dtable=new DataTable();
dtable=sts.mReadTableInfors();
if(dtable!=null)
{
   dgv_TableStructure.DataSource=dtable;
   for(int i=1;i<=dgv_TableStructure.Columns.Count-1;
i++)
   {dgv_TableStructure.Columns[i].Width=80;}
//設(shè)置DataGridView列寬
}
 其中,SQL查詢(xún)語(yǔ)句sqlstr由屬性選擇模塊生成,連接字符串connstr與數(shù)據(jù)庫(kù)連接模塊一致。因此,該模塊的運(yùn)行流程可描述為:(1)通過(guò)實(shí)例化cShowTableStructure類(lèi),新建一個(gè)sts對(duì)象,設(shè)置連接字符串與查詢(xún)語(yǔ)句;(2)調(diào)用mReadTableInfors方法,讀取表結(jié)構(gòu)信息,以DataTable格式返回查詢(xún)結(jié)果;(3)將查詢(xún)結(jié)果作為DataGridView控件的數(shù)據(jù)源,輸出到用戶(hù)界面。
1.4 數(shù)據(jù)導(dǎo)出模塊
 通過(guò)表設(shè)計(jì)結(jié)構(gòu)輸出模塊,可以方便地獲取相應(yīng)表所包含的字段及其屬性,為了實(shí)現(xiàn)數(shù)據(jù)設(shè)計(jì)與文檔整理的同步,需要將DataGridView控件中的信息導(dǎo)出到Excel或word文檔中,以便開(kāi)發(fā)編寫(xiě)開(kāi)發(fā)文檔和團(tuán)隊(duì)交流時(shí)使用。系統(tǒng)提供了兩種應(yīng)用接口,用戶(hù)可根據(jù)需要將表結(jié)構(gòu)輸出到Excel或word文檔。限于篇幅,本文僅介紹將表結(jié)構(gòu)導(dǎo)出到Excel文檔的實(shí)現(xiàn)方法,其關(guān)鍵代碼如下:
//新建一個(gè)Excel應(yīng)用,設(shè)置屬性與文檔名
Excel.Application texcel=new Excel.Application();
texcel.Application.Workbooks.Add(true);
texcel.Visible=isShowExcel;
texcel.SaveWorkspace(TableName+"表的結(jié)構(gòu)");
int co_count=dgv_TableStructure.Columns.Count;
int row_count=dgv_TableStructure.Rows.Count;
//第一行合并單元格,輸出表名
string Title_End=endChar+"1";
texcel.Cells.get_Range("A1",Title_End).MergeCells=true;
texcel.Cells[1,1]=TableName+"表的設(shè)計(jì)結(jié)構(gòu)";
//第二行輸出相應(yīng)的字段名
for(int i=0;i<=co_count-1;i++)
{texcel.Cells[2,i+1]=dgv_TableStructure.Columns[i].
HeaderText;}
//從第三行開(kāi)始,輸出表的結(jié)構(gòu)信息
for(int i=0;i<row_count-1;i++){
   for(int j=0;j<=co_count-1;j++){
     if(dgv_TableStructure[j,i].ValueType==typeof
(string))
      texcel.Cells[i+3,j+1]=""+dgv_TableStructure[j,i].
Value;
     else
      texcel.Cells[i+3,j+1]=dgv_TableStructure[j,i].
Value.ToString();
    }
}
//設(shè)置Excel有效數(shù)據(jù)區(qū)域的格式
char endChar=Convert.ToChar(′A′+co_count-1);
 …… ……
content_range.Borders.LineStyle=BorderStyle.FixedSingle;
 因此,該模塊的工作流程可描述為:(1)新建一個(gè)Excel應(yīng)用,設(shè)置相關(guān)屬性;(2)計(jì)算輸出到有效數(shù)據(jù)的行、列數(shù),在第一行輸出表名稱(chēng);(3)將DataGridView控件表頭文本作為字段名,輸出到第二行;(4)從第三行開(kāi)始,逐單元格輸出對(duì)應(yīng)信息;(4)選擇Excel中的數(shù)據(jù)區(qū)域,設(shè)置其邊框、字體等格式樣式。
1.5 關(guān)鍵類(lèi)cShowTableStructure實(shí)現(xiàn)

 


 在1.1節(jié)數(shù)據(jù)庫(kù)連接模塊與1.3節(jié)表設(shè)計(jì)結(jié)構(gòu)輸出模塊中,都用到了一個(gè)名為cShowTableStructure的類(lèi),該類(lèi)的主要功能是實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢(xún),并將查詢(xún)結(jié)果通過(guò)一個(gè)DataTable返回。cShowTableStructure類(lèi)封裝了兩個(gè)屬性(SQL查詢(xún)語(yǔ)句sqlStr與連接字符串connStr)及一個(gè)方法mReadTableInfors,mReadTableInfors的關(guān)鍵代碼如下:
SqlConnection conn=new SqlConnection(connstr);
SqlCommand cmd=new SqlCommand(sqlstr,conn);
DataTable dtable=new DataTable();
SqlDataAdapter sda=new SqlDataAdapter();
try
{   conn.Open();
    sda=new SqlDataAdapter(cmd);
    sda.Fill(dtable);
}
catch(Exception x)
{  ……      //異常處理}
Finally
{  ……      //資源釋放}
return dtable;
2 業(yè)務(wù)流程圖
 系統(tǒng)的業(yè)務(wù)流程如圖2所示,該流程可描述為:(1)選擇操作模式(單表導(dǎo)出或批量導(dǎo)出);(2)用戶(hù)輸入數(shù)據(jù)庫(kù)服務(wù)器地址(名稱(chēng))、數(shù)據(jù)庫(kù)名、用戶(hù)名和密碼;(3)系統(tǒng)驗(yàn)證數(shù)據(jù)庫(kù)所提交信息的正確性,若通過(guò)驗(yàn)證,則轉(zhuǎn)第(4)步,否則轉(zhuǎn)第(2)步;(4)讀取數(shù)據(jù)庫(kù)包含的所有表格,將表名輸出到用戶(hù)界面,用戶(hù)選擇并提交所選表格;(5)選擇對(duì)所選表需查看、輸出的結(jié)構(gòu)屬性;(6)提交查詢(xún),在用戶(hù)界面顯示查詢(xún)結(jié)果;(7)選擇導(dǎo)出方式,將表的設(shè)計(jì)結(jié)構(gòu)導(dǎo)出到Word或Excel文檔。

 數(shù)據(jù)庫(kù)設(shè)計(jì)是項(xiàng)目開(kāi)發(fā)的一項(xiàng)重要內(nèi)容,在數(shù)據(jù)庫(kù)設(shè)計(jì)階段,開(kāi)發(fā)團(tuán)隊(duì)需就其表結(jié)構(gòu)反復(fù)地進(jìn)行論證、修訂與完善;進(jìn)入編碼階段后,盡管不鼓勵(lì)對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)再進(jìn)行修改,但小幅度的調(diào)整與優(yōu)化往往難以杜絕。為方便團(tuán)隊(duì)協(xié)作與后期維護(hù),在對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)調(diào)整后,及時(shí)更新項(xiàng)目開(kāi)發(fā)文檔顯得尤為重要。但在對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)改動(dòng)后,手工調(diào)整或借助第三方工具重新生成說(shuō)明文檔,工作繁復(fù)且難以確保對(duì)表結(jié)構(gòu)描述的一致性。針對(duì)這一需求,本文開(kāi)發(fā)了一個(gè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)自動(dòng)導(dǎo)出系統(tǒng),以方便用戶(hù)根據(jù)需要導(dǎo)出表的結(jié)構(gòu)信息,具有小巧便捷、操作簡(jiǎn)單的優(yōu)點(diǎn),將其作為團(tuán)隊(duì)開(kāi)發(fā)的輔助工具,能較大幅度提高工作效率。
參考文獻(xiàn)
[1] 何玉潔.數(shù)據(jù)庫(kù)原理與實(shí)踐教程[M].北京:清華大學(xué)出版社,2010.
[2] 王征,呂雷.SQL Server 2008中文版數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)踐教程[M].北京:電子工業(yè)出版社,2009.
[3] 李偉.數(shù)據(jù)完整性在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的設(shè)計(jì)與實(shí)施[J].煤炭技術(shù),2011,30(3):167-168.
[4] 朱曉輝,王杰華,石振國(guó),等..NET下基于PowerDesigner和CodeSmith的軟件自動(dòng)化開(kāi)發(fā)技術(shù)[J].計(jì)算機(jī)科學(xué),2010,37(7):156-160.
[5] 謝星星,沈懿卓.UML基礎(chǔ)與Rose建模實(shí)用教程[M].北京:清華大學(xué)出版社,2008.
[6] 張慶輝,邵易峰.基于Power Designer的通信裝備數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)現(xiàn)[J].艦船電子工程,2012(2):68-70.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
午夜久久影院| 欧美成人在线免费视频| 亚洲欧洲在线看| 午夜综合激情| 亚洲午夜一区| 亚洲午夜久久久久久尤物| 亚洲乱码一区二区| 亚洲精品久久在线| 亚洲精品久久久久中文字幕欢迎你| 激情久久五月| 国内揄拍国内精品久久| 国产亚洲欧洲997久久综合| 国产嫩草影院久久久久| 国产精品亚洲综合天堂夜夜| 国产精品多人| 国产精品久久久久高潮| 欧美午夜激情在线| 国产精品久久福利| 国产精品一二一区| 国产亚洲欧美aaaa| 国产真实久久| 永久免费毛片在线播放不卡| 精久久久久久久久久久| 国产性做久久久久久| 国产亚洲成av人片在线观看桃 | 在线成人www免费观看视频| 狠狠网亚洲精品| 亚洲第一主播视频| 亚洲人成网站999久久久综合| 亚洲啪啪91| 亚洲最新视频在线播放| 亚洲视频图片小说| 午夜国产欧美理论在线播放| 欧美中文字幕在线| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲综合大片69999| 午夜在线不卡| 亚洲高清在线观看| av成人黄色| 欧美亚洲在线观看| 久久免费一区| 欧美久久久久久久久久| 国产精品久久久对白| 国产一区二区三区四区在线观看| 禁久久精品乱码| 日韩亚洲欧美高清| 性色av一区二区三区红粉影视| 亚洲国产福利在线| 中文欧美字幕免费| 欧美在线黄色| 欧美成人精品高清在线播放| 欧美精品黄色| 国产精品主播| 亚洲国产精品va在看黑人| 一区二区日韩精品| 欧美一区二区日韩一区二区| 亚洲国产一区二区在线| 亚洲一本大道在线| 久久久久久高潮国产精品视| 欧美激情综合色| 国产精品网曝门| 亚洲国产激情| 午夜天堂精品久久久久| 亚洲乱码国产乱码精品精天堂| 亚洲欧美日本视频在线观看| 美国成人毛片| 国产精品麻豆成人av电影艾秋| 国语自产精品视频在线看| 99视频超级精品| 久久精品亚洲乱码伦伦中文 | 亚洲精品一二区| 欧美一级久久久| 一区二区三区导航| 久久午夜色播影院免费高清| 欧美视频免费看| 尤物网精品视频| 亚洲一区三区电影在线观看| 亚洲日本欧美天堂| 久久精品欧美日韩精品| 欧美日韩在线三区| 极品尤物一区二区三区| 亚洲一区免费在线观看| 日韩一区二区福利| 久久亚洲高清| 国产精品自拍在线| a4yy欧美一区二区三区| 亚洲国产一区二区精品专区| 欧美一区二区日韩一区二区| 欧美日韩极品在线观看一区| 激情欧美亚洲| 午夜久久一区| 亚洲综合欧美日韩| 欧美aa国产视频| 国产午夜精品久久| 亚洲手机在线| 一区二区三区蜜桃网| 嫩草成人www欧美| 狠狠噜噜久久| 香蕉久久精品日日躁夜夜躁| 亚洲在线播放电影| 欧美日韩一区三区四区| 亚洲激情在线| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久久国产精品一区二区| 国产毛片一区| 午夜精品久久久久影视| 亚洲影院污污.| 欧美色精品天天在线观看视频| 亚洲人成网站在线播| 亚洲欧洲日本mm| 裸体歌舞表演一区二区| 国内精品久久国产| 香蕉国产精品偷在线观看不卡| 性色av一区二区三区在线观看| 欧美日韩在线亚洲一区蜜芽| 亚洲国产婷婷综合在线精品| 亚洲欧洲精品一区| 欧美freesex交免费视频| 今天的高清视频免费播放成人 | 欧美在线视屏| 久久久久久久精| 国产主播在线一区| 欧美主播一区二区三区| 久久久久99| 黄色成人片子| 亚洲国产精品久久久久秋霞影院| 久久一区二区三区四区| 尤物网精品视频| 亚洲精品一区二区三区婷婷月| 欧美成人一区在线| 亚洲精品中文字幕女同| 亚洲视频综合在线| 国产精品国产三级国产a| 亚洲午夜精品网| 欧美一区二区三区在线观看视频| 国产欧美亚洲精品| 久久精品视频免费播放| 欧美高清在线| 99天天综合性| 午夜精品久久久久久久男人的天堂 | 亚洲免费观看在线视频| 亚洲午夜久久久久久久久电影网| 国产精品成人在线| 亚洲欧美一区二区在线观看| 久久九九国产精品| 亚洲大胆美女视频| 一本一本久久a久久精品综合麻豆| 欧美日韩亚洲免费| 亚洲欧美日韩在线播放| 久久九九99视频| 亚洲日本欧美日韩高观看| 亚洲一区亚洲| 国产一区亚洲| 亚洲乱码一区二区| 国产精品你懂的在线欣赏| 欧美在线观看视频在线| 欧美高清在线视频观看不卡| 99精品99久久久久久宅男| 性欧美8khd高清极品| 精品动漫3d一区二区三区免费| 一区二区三区欧美日韩| 国产精品一区在线观看你懂的| 亚洲二区三区四区| 欧美日韩一区二区视频在线观看| 午夜亚洲性色福利视频| 欧美精品粉嫩高潮一区二区| 亚洲综合社区| 欧美国产日韩亚洲一区| 亚洲中字黄色| 欧美国产在线视频| 先锋影音久久| 欧美日本三级| 欧美一区二区三区在线观看视频 | 欧美—级高清免费播放| 亚洲一区二区伦理| 欧美凹凸一区二区三区视频| 亚洲一级片在线观看| 欧美va亚洲va香蕉在线| 亚洲在线成人| 欧美极品影院| 欧美一区二区三区精品电影| 欧美精品粉嫩高潮一区二区| 欧美一级网站| 欧美日韩三区四区| 久久av最新网址| 国产精品xnxxcom| 亚洲黄色影片| 国产精品自在欧美一区| 一区二区三区高清在线观看| 国内精品伊人久久久久av一坑| 亚洲午夜成aⅴ人片| 激情五月综合色婷婷一区二区| 亚洲一区日韩在线| 亚洲国产三级网| 久久久青草婷婷精品综合日韩| aa亚洲婷婷| 免费在线播放第一区高清av| 亚洲欧美激情视频| 欧美日韩视频在线| 91久久精品久久国产性色也91|