存儲過程簡介

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

存儲過程的好處

1.由于數(shù)據(jù)庫執(zhí)行動作時,是先編譯后執(zhí)行的孝鹊。然而存儲過程是一個編譯過的代碼塊炊琉,所以執(zhí)行效率要比T-SQL語句高。

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

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

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


存儲過程的語法和參數(shù)講解


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

-------------創(chuàng)建存儲過程-----------------

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

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

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

--------------調(diào)用存儲過程-----------------

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

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

drop procedure procedure_name --在存儲過程中能調(diào)用另外一個存儲過程系吭,而不能刪除另外一個存儲過程

創(chuàng)建存儲過程的參數(shù):

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

2.; number:是可選的整數(shù)欢顷,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如拼岳,名為 orders 的應用程序使用的過程可以命名為 orderproc;1祠够、orderproc;2 等湿滓。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數(shù)字不應包含在標識符中较坛,只應在 procedure_name 前后使用適當?shù)亩ń绶?/p>

3.@parameter: 存儲過程的參數(shù)”#可以有一個或多個略水。用戶必須在執(zhí)行過程時提供每個所聲明參數(shù)的值(除非定義了該參數(shù)的默認值)。存儲過程最多可以有 2.100 個參數(shù)贯要。
使用 @ 符號作為第一個字符來指定參數(shù)名稱。參數(shù)名稱必須符合標識符的規(guī)則资铡。每個過程的參數(shù)僅用于該過程本身沮明;相同的參數(shù)名稱可以用在其它過程中。默認情況下,參數(shù)只能代替常量螺句,而不能用于代替表名庶诡、列名或其它數(shù)據(jù)庫對象的名稱隘击。有關更多信息宪萄,請參見 EXECUTE。

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

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

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

7.OUTPUT :表明參數(shù)是返回參數(shù)欠母。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數(shù)可將信息返回給調(diào)用過程吆寨。Text赏淌、ntext 和 image 參數(shù)可用作 OUTPUT 參數(shù)。使用 OUTPUT 關鍵字的輸出參數(shù)可以是游標占位符啄清。

8.RECOMPILE: 表明 SQL Server 不會緩存該過程的計劃六水,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內(nèi)存中的執(zhí)行計劃時辣卒,請使用 RECOMPILE 選項掷贾。

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

10.FOR REPLICATION :指定不能在訂閱服務器上執(zhí)行為復制創(chuàng)建的存儲過程啡莉。.使用 FOR REPLICATION 選項創(chuàng)建的存儲過程可用作存儲過程篩選港准,且只能在復制過程中執(zhí)行。本選項不能和 WITH RECOMPILE 選項一起使用咧欣。

11.AS :指定過程要執(zhí)行的操作浅缸。

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

小結:看過這些基本語法后疗杉,下面我就根據(jù)語法創(chuàng)建各式的存儲過程。


創(chuàng)建存儲過程


| UserAccount |
| UserID | UserName | PassWord | RegisterTime | RegisterIP |
| 12 | 6 | 6 | 2012-12-31 | 6 |
| 18 | 5 | 5 | 2013-01-01 | 5 |
| 19 | 1 | 1 | 2013-01-01 | 1 |
| 20 | 2 | 2 | 2013-01-01 | 2 |
| 21 | 3 | 3 | 2013-01-01 | 3 |
| 22 | 4 | 4 | 2013-01-01 | 4 |
| 23 | 5 | 5 | 2013-01-01 | 5 |
| 25 | 7 | 7 | 2013-01-01 | 7 |
| 26 | 8 | 8 | 2013-01-01 | 8 |
| NULL | NULL | NULL | NULL | NULL |

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

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

-------------創(chuàng)建名為GetUserAccount的存儲過程----------------

create Procedure GetUserAccount as
select * from UserAccount go

-------------執(zhí)行上面的存儲過程----------------

exec GetUserAccount

結果:相當于運行 select * from UserAccount 這行代碼烟具,結果為整個表的數(shù)據(jù)。

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

-------------創(chuàng)建名為GetUserAccount的存儲過程----------------

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

-------------執(zhí)行上面的存儲過程----------------

exec inUserAccount

結果:
相當于運行

insert into UserAccount (
UserName,
[PassWord],
RegisterTime,
RegisterIP
) values(9,9,'2013-01-02',9) 

這行代碼奠蹬。

3.有返回值的存儲過程

-------------創(chuàng)建名為GetUserAccount的存儲過程----------------

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

-------------執(zhí)行上面的存儲過程----------------

exec inUserAccountRe</pre>

解釋:這里的@@rowcount為執(zhí)行存儲過程影響的行數(shù)朝聋,執(zhí)行的結果是不僅插入了一條數(shù)據(jù),還返回了一個值即 return value =1 囤躁,這個可以在程序中獲取冀痕,稍后在c#調(diào)用存儲過程中會有說到荔睹。

4.有輸入?yún)?shù)和輸出參數(shù)的存儲過程

-------------創(chuàng)建名為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

-------------執(zhí)行上面的存儲過程----------------

exec GetUserAccountRe '7',null

解釋:@UserName為輸入?yún)?shù),@UserID為輸出參數(shù)言蛇。 運行結果為@userID為COOUT(*)即 =1僻他。

5. 同時具有返回值、輸入?yún)?shù)腊尚、輸出參數(shù)的存儲過程

-------------創(chuàng)建名為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

-------------執(zhí)行上面的存儲過程----------------

exec GetUserAccountRe1 '7',null

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

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

-------------創(chuàng)建名為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

-------------執(zhí)行上面的存儲過程----------------

exec GetUserAccountRe2 '7',null

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

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

-------------創(chuàng)建名為GetUserAccount的存儲過程----------------

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

-------------執(zhí)行上面的存儲過程----------------

exec GetUserAccountRe3

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

小結:上面我們創(chuàng)建了各式的存儲過程活鹰,下面看我們在c#中怎樣調(diào)用這些存儲過程哈恰。


c#調(diào)用存儲過程


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

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()
        { // 創(chuàng)建參數(shù) 
            SqlCommand cmd = common("inUserAccountRe");
            IDataParameter[] parameters = { new SqlParameter("rval", SqlDbType.Int,4) 
             }; // 將參數(shù)類型設置為 返回值類型 
            parameters[0].Direction = ParameterDirection.ReturnValue; // 添加參數(shù) 
            cmd.Parameters.Add(parameters[0]);
            con.Open(); // 執(zhí)行存儲過程并返回影響的行數(shù) 
            Label1.Text = cmd.ExecuteNonQuery().ToString();
            con.Close(); // 顯示影響的行數(shù)和返回值 
            Label1.Text += "-" + parameters[0].Value.ToString();
        } //有輸入?yún)?shù)和輸出參數(shù)的存儲過程
        public void runGetUserAccountRe()
        {
            SqlCommand cmd = common("GetUserAccountRe"); // 創(chuàng)建參數(shù) 
            IDataParameter[] parameters = { new SqlParameter("@UserName", SqlDbType.NChar,20) , new SqlParameter("@UserID", SqlDbType.Int) ,
             }; // 設置參數(shù)類型 
            parameters[0].Value = "7";  
            parameters[1].Direction = ParameterDirection.Output;  // 設置為輸出參數(shù) // 添加參數(shù) 
            cmd.Parameters.Add(parameters[0]);
            cmd.Parameters.Add(parameters[1]);
            con.Open(); // 執(zhí)行存儲過程并返回影響的行數(shù) 
            Label1.Text = cmd.ExecuteNonQuery().ToString();
            con.Close(); // 顯示影響的行數(shù)和輸出參數(shù) 
            Label1.Text += "-" + parameters[1].Value.ToString();

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

        } //同時返回參數(shù)和記錄集的存儲過程GetUserAccountRe2
        public void runGetUserAccountRe2()
        {
            SqlCommand cmd = common("GetUserAccountRe2"); // 創(chuàng)建參數(shù) 
            IDataParameter[] parameters = { new SqlParameter("@UserName", SqlDbType.NChar,20) , new SqlParameter("@UserID", SqlDbType.Int) , new SqlParameter("rval", SqlDbType.Int,4) 
             }; // 設置參數(shù)類型 
            parameters[0].Value = "7";
            parameters[1].Direction = ParameterDirection.Output;  // 設置為輸出參數(shù) 
            parameters[2].Direction = ParameterDirection.ReturnValue;  //設置為返回值 // 添加參數(shù) 
            cmd.Parameters.Add(parameters[0]);
            cmd.Parameters.Add(parameters[1]);
            cmd.Parameters.Add(parameters[2]);
            con.Open(); // 執(zhí)行存儲過程并返回影響的行數(shù) 
            Label1.Text = cmd.ExecuteNonQuery().ToString();
            DataSet ds = new DataSet();
            SqlDataAdapter dt = new SqlDataAdapter(cmd);
            dt.Fill(ds);
            rpt.DataSource = ds;
            rpt.DataBind();
            con.Close(); // 顯示影響的行數(shù)和輸出參數(shù) 
            Label1.Text += "-輸出參數(shù)為:" + 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; // 如果執(zhí)行語句 
            cmd.CommandText = proName; // 指定執(zhí)行語句為存儲過程 
            cmd.CommandType = CommandType.StoredProcedure; return cmd;
        }
    }

附帶SQLServer數(shù)據(jù)庫的一些全局變量


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

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

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

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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末批狐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子前塔,更是在濱河造成了極大的恐慌嚣艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华弓,死亡現(xiàn)場離奇詭異食零,居然都是意外死亡,警方通過查閱死者的電腦和手機寂屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門贰谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迁霎,你說我怎么就攤上這事吱抚。” “怎么了考廉?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵秘豹,是天一觀的道長。 經(jīng)常有香客問我昌粤,道長既绕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任涮坐,我火速辦了婚禮凄贩,結果婚禮上,老公的妹妹穿的比我還像新娘袱讹。我一直安慰自己疲扎,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布捷雕。 她就那樣靜靜地躺著椒丧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪非区。 梳的紋絲不亂的頭發(fā)上瓜挽,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音征绸,去河邊找鬼久橙。 笑死俄占,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的淆衷。 我是一名探鬼主播缸榄,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祝拯!你這毒婦竟也來了甚带?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佳头,失蹤者是張志新(化名)和其女友劉穎鹰贵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體康嘉,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碉输,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亭珍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敷钾。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肄梨,靈堂內(nèi)的尸體忽然破棺而出阻荒,到底是詐尸還是另有隱情,我是刑警寧澤众羡,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布侨赡,位于F島的核電站,受9級特大地震影響纱控,放射性物質(zhì)發(fā)生泄漏辆毡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一甜害、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧球昨,春花似錦尔店、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至共螺,卻和暖如春该肴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藐不。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工匀哄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秦效,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓涎嚼,卻偏偏與公主長得像阱州,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子法梯,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容