SQL Server Denali 新增的程式化功能(上)

by byron 24. 八月 2011 20:29

前言
SQL Server 即將到來的最新版本其 Code Name 為「Denali」,現今可公開下載的測試版本為 CTP(Community Technology Preview) 3,不似前兩個 CTP 版,一些主要的新增功能尚未加入,在此 CTP 版本都可見到與試用。而我們先就 Denali新增的程式化功能稍作介紹。由於 CTP 3 的線上說明可以在 MSDN 或 TechNet 檢視,故此並不對每個語法功能細節詳加描述,僅以範例說明主要用途。
Sequence 物件
資料庫內的「可程式性」類型物件多了「Sequences」物件,它的功能類似 Identity 欄位,由 SQL Server維護遞增值。但它是獨立的物件,不隸屬於任一個資料表。透過 Sequence 可以建立公式化的流水號,或讓多個資料表穿插使用相同的流水號序列。如範例程式碼1所示:
USE tempdb
GO
-- 建立 Sequence
CREATE SEQUENCE MySequence
AS INT MINVALUE 1 NO MAXVALUE START WITH 1 INCREMENT BY 1 CYCLE;

-- 建立資料表
CREATE TABLE TSeq1 (col1 int, col2 varchar(50));
CREATE TABLE TSeq2 (col1 int, col2 varchar(50));
GO
INSERT TSeq1 (col1, col2) VALUES (NEXT VALUE FOR MySequence, 'test')
INSERT TSeq2 (col1, col2) VALUES (NEXT VALUE FOR MySequence, 'test')
GO 10

SELECT * FROM sys.sequences
範例程式碼1:在資料庫內建立 Sequence 物件,藉以取回流水序號
其執行結果如圖 1 所示:
 image
圖 1:透過 Sequence 物件產生共用的遞增數值
在範例程式碼 1 中透過新增的 CREATE SEQUENCE 語法建立 Sequence 物件,設定其最大、最小、初始與遞增值,而後便可以藉由 NEXT VALUE FOR Sequence 語法取得 Sequence 物件的遞增資料,交錯放到兩個資料表中。
從圖 1 可以看到 Management Studio 增加了對 Sequence 物件的管理介面,同時,除了建立 Sequence 物件與循序取值放入到不同的資料表外,也可以重新設定 Sequence 物件當下值,或是透過 SELECT 語法直接傳回Sequence 物件的下一個值,並組成所需的流水序號格式,如範例程式碼 2 所示:
--將 Sequence Object 的值重新設定為 10
ALTER SEQUENCE MySequence RESTART WITH 10;

--直接傳回 Sequece Object 的值
SELECT NEXT VALUE FOR MySequence

--組織成特定格式的流水號
SELECT '2011_' + convert(varchar(10),NEXT VALUE FOR MySequence)

--建立資料表時,賦予欄位預設值為特定流水號格式
create table t(c1 varchar(20)
default ('2011_' + convert(varchar(10),NEXT VALUE FOR MySequence)))

DROP TABLE TSeq1
DROP TABLE TSeq2
DROP SEQUENCE MySequence
範例程式碼2:維護予刪除資料庫內的 Sequence 物件
關於Sequence 物件的相關說明,也可以參閱如下的網址:
http://msdn.microsoft.com/en-us/library/ff878058(v=SQL.110).aspx
將資料分頁,取其紀錄
若要將資料表內的紀錄以 10 筆為一頁,指定特定的頁數傳回到前端應用程式,在現今的 SQL Server 可以用如範例程式碼3的兩種方式:
USE AdventureWorks2008R2
GO

DECLARE @pageSize int = 10;
DECLARE @pageNumber int = 2;
-- 較耗資源,不建議使用
SELECT TOP (@pageSize * @pageNumber) BusinessEntityID,NameStyle,Title
FROM Person.Person
EXCEPT
SELECT TOP (@pageSize * (@pageNumber - 1)) BusinessEntityID,NameStyle,Title
FROM Person.Person;

--透過 row_number 搭配 CTE 取回某一頁內的紀錄
WITH tb(ID,BusinessEntityID,NameStyle,Title)
AS
(SELECT ROW_NUMBER() OVER(Order by BusinessEntityID) ID,
BusinessEntityID,NameStyle,Title
FROM Person.Person)
SELECT BusinessEntityID,NameStyle,Title FROM tb
WHERE ID BETWEEN (@pageSize * (@pageNumber - 1))+1 AND (@pageSize * @pageNumber)
範例程式碼3:透過 Except 或 Row_Number 取回的 m 到 n 筆記錄
範例程式碼3 中的 Except 運算子和 Row_Number() 函數;以及 CTE 語法都是 SQL Server 2005 後提供的功能,但針對上述分頁的需求,就效能而言,Row_Number() 函數搭配 CTE 語法是較佳的作法。
Denali 替 Order By 子句新增了 Offset 和 Fetch 語法,也可做到分頁存取的功能,其效能與Row_Number() 函數搭配 CTE 語法一樣,但寫作方式較直觀,如範例程式碼4所示:
SELECT BusinessEntityID,NameStyle,Title
FROM Person.Person
ORDER BY BusinessEntityID DESC
OFFSET @pageSize * (@pageNumber - 1) ROWS
FETCH NEXT @pageSize ROWS ONLY;
範例程式碼 4:透過 Offset 和 Fetch Next 取回的 m 到 n 筆記錄

Exec 語法指定結果集格式
當呼叫預存程序並取得回傳的資料結果集時,可能需要特定的欄位名稱或資料類型,Denali 的 EXEC語法新增了 WITH RESULT SETS 子句,可指定結果集結構,如範例程式碼 5 所示:
USE Northwind
GO
CREATE PROC spGetCustOrders @Date DATETIME
AS
SELECT CompanyName,OrderID,OrderDate FROM
Customers c JOIN Orders o ON c.CustomerID=o.CustomerID
WHERE OrderDate < @Date

SELECT o.OrderID,Sum(UnitPrice*Quantity*(1-Discount)) SumSales
FROM Orders o JOIN [Order Details] d ON o.OrderID=d.OrderID
WHERE o.OrderDate<@Date
GROUP BY o.OrderID
GO

--執行預存程序時,指定回傳的資料結構
EXEC spGetCustOrders '19960731'
WITH RESULT SETS
(
    ([公司名稱] nvarchar(100) not null,
     [訂單編號] int not null,
     [訂單日期] date),
    ([訂單編號] int not null,
     [銷售金額] money
    )
)
範例程式碼 5:透過 With Result Sets 指定執行完預存程序後,其回傳結果集的資料欄位結構
執行結果如圖 2 所示:
 image
圖 2:透過 With Result Sets 指定執行完預存程序回傳的結果集
在範例程式碼 5 的預存程序定義中,筆者故意指定兩句 SELECT 語法,以傳回兩個結果集。因此在WITH RESULT SETS 子句中,以近似定義資料表的方式指定依順序對應的結果集之欄位名稱與資料類型,而前端程式將接收到轉換成符合該資料類型的結果。
取得結果集格式定義
若要取得某句語法執行回傳結果集的中繼資料,亦即欄位名稱、順序、是否可以 NULL、資料類型、文字欄位的定序…等,可透過如下新增的預存程序和動態管理函數:
    sp_describe_first_result_set 預存程序:以T-SQL語句作為參數,回傳該語法第一個結果集的metadata。
    sp_describe_undeclared_parameters 預存程序:描述 T-SQL 批次中,沒有宣告的參數之中繼資料。
    sys.dm_exec_describe_first_result_set 動態管理函數:與sp_describe_first_result_set 預存程序相似,以T-SQL語句作為參數,回傳該語法第一個結果集的metadata。
    sys.dm_exec_describe_first_result_set_for_object 動態管理函數:以物件編號(OBJECT ID)作為參數,回傳該物件第一個結果集的metadata。
sp_describe_first_result_set 預存程序和動態管理函數 sys.dm_exec_describe_first_result_set 功能近似,故僅擇一介紹。
sys.dm_exec_describe_first_result_set 動態管理函數的第一個參數傳入 T-SQL批次語句,回傳第一個結果集的中繼資料,換句話說,若 SQL 語法會回傳多個結果集,則第二個以後的結果集沒有說明。sys.dm_exec_describe_first_result_set 動態管理函數回傳的結果集以一筆記錄說明參數傳入 T-SQL語句第一個結果集之一欄位。如範例程式碼 6 所示:
select * FROM  sys.dm_exec_describe_first_result_set (
N'select * from sys.objects;
select * from sys.sysobjects', NULL , 0)
執行結果如圖 3 所示:
 image
圖 3:透過 sys.dm_exec_describe_first_result_set 動態管理函數取得第一個結果集的欄位定義
如同預存程序或動態管理函數名稱所強調,它們只傳回第一個結果集,故沒有上述範例的第二句語法之結果集。另外,sys.dm_exec_describe_first_result_set 動態管理函數回傳的欄位很多,圖 3 只取了部分的結果。
而透過這些欄位定義,可以直接組織建立資料表的語法,如範例程式碼 6 所示:
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM sys.dm_exec_sessions;';
DECLARE @tbl nvarchar(max)=''
SELECT @tbl=@tbl+ CASE column_ordinal WHEN 1 THEN '' ELSE ',' END
+ name + ' ' + system_type_name +
CASE is_nullable WHEN 0 THEN ' not null
' ELSE '
' END
FROM  sys.dm_exec_describe_first_result_set (@sql, NULL, 0) AS f
ORDER BY    column_ordinal;
SET @tbl='CREATE TABLE dbo.#t('+ '
' + @tbl + ');
INSERT #t SELECT * FROM sys.dm_exec_sessions;
SELECT * FROM #t';
EXEC(@tbl)
範例程式碼 6:透過 sys.dm_exec_describe_first_result_set 動態管理函數建立資料表
須強調一點的是,若回傳的結果集不確定,例如依據傳入的參數動態組字串,或是商業邏輯會改變回傳的結果集,都將無法取得定義。例如,以下的語法可行:
create proc sp @i int
as
select top(@i) * from sys.objects
go

select * FROM  sys.dm_exec_describe_first_result_set ('exec sp', NULL , 0)
但若預存程序的定義如下:
create proc sp @i int
as
if @i=1
    select * from sys.objects
if @i=2
    select * from sys.sysobjects
因為參數不同回傳的結果集就不同,sys.dm_exec_describe_first_result_set 將無法傳回結果集的描述了。
由於未來 SQL Server 可能停掉 SELECT INTO <資料表名稱> 的語法 ,故透過上述方式取得定義並建立資料表可能變成必須。但,目前的彈性似乎不足
sp_describe_undeclared_parameters 系統預存程序可傳回 T-SQL 批次語法中,各參數的中繼資料,如範例程式碼 7 所示:
exec sp_describe_undeclared_parameters
   @tsql =N'select * from customers where customerid = @CustomerID
   and Country LIKE @Country'
範例程式碼 7:透過 sp_describe_undeclared_parameters 系統預存程序查詢 T-SQL 批次語法中的參數定義
執行結果如圖 4 所示:
 image
圖 4:傳回 T-SQL 語法中的參數定義
圖 4 的 suggested_system_type_name 欄位可以看到因為 Where 子句搭配的運算子是 Like,讓sp_describe_undeclared_parameters 系統預存程序推估 @Country 參數的資料類型是 nvarchar(4000) 而非原欄位定義 nvarchar(15)。
呼叫 sp_describe_undeclared_parameters 系統預存程序時,若已經透過第二個以後的參數定義了 T-SQL 語法中的參數,則回傳結果集中就不會包含該參數,將範例程式碼 7 加入 @CustomerID 參數的定義,測試語法如下:
exec sp_describe_undeclared_parameters
   @tsql =N'select * from customers where customerid like @CustomerID
   and Country LIKE @Country',@params=N'@CustomerID nvarchar(5)'
其圖 4 的執行結果也就少了第一筆記錄。
Throw
T-SQL 現今與諸多程式語言相同,可透過 throw 關鍵字拋出異常,將程式執行權移交給TRY ... CATCH 結構的 CATCH區塊,而不似以往需透過 RAISERROR 語法。透過 throw 可以簡單地重新丟出錯誤,以往若在 Catch 語法處理錯誤後,想要拋回相同的錯誤,其語法可以如範例程式碼 8 所示:
BEGIN TRY
    INSERT dbo.TestRethrow VALUES(1),(1);
END TRY
BEGIN CATCH
PRINT FormatMessage('在catch塊。Error %d',ERROR_NUMBER());

DECLARE @errMsg NVARCHAR(2048)=ERROR_MESSAGE()
DECLARE @errSeverity INT=ERROR_SEVERITY()
DECLARE @errState INT=ERROR_STATE()
RAISERROR(@errMsg,@errSeverity,@errState)
END CATCH;
範例程式碼 8:透過 RAISERROR 語法拋出錯誤
其執行結果如下:
在catch塊。Error 2627
訊息 50000,層級 14,狀態 1,行 10
違反 PRIMARY KEY 條件約束 'PK__TestReth__3213663B6B946A82'。無法在物件 'dbo.TestRethrow' 中插入重複的索引鍵。重複的索引鍵值是 (1)。
而今直接透過 throw 關鍵字即可:
BEGIN TRY
    INSERT dbo.TestRethrow VALUES(1),(1);
END TRY
BEGIN CATCH
PRINT FormatMessage('在catch塊。Error %d',ERROR_NUMBER());

THROW;
END CATCH;
可以不先透過 sp_addmessage 系統預存程序建立存在 sys.messages 的訊息定義,就直接丟出客製化錯誤。範例如下:
DECLARE @str NVARCHAR(1000)=FormatMessage('資料表 %s 內紀錄 %d 不存在','tbl',123456);
THROW 50001,@str,1;
執行結果如下:
訊息 50001,層級 16,狀態 1,行 2
資料表 tbl 內紀錄 123456 不存在
Throw 在 CATCH 區塊內外皆可使用,在外部使用時,嚴重程度固定為 16。Throw 與 RAISERROR 語法想比,其功能較少,而就我所讀到的線上說明而言,未來的版本仍支援 RAISERROR,並未因有了 throw 而要放棄。
空間資料
T-SQL 除了增加新的空間函數外,在 Geometry 和 Geography 內新增子類型 CircularString, CompoundCurve, CurvePolygon,原本透過 3 個點若要定義線,只能定義兩段直線,現在可以定義一條曲線,如範例程式碼 9 所示:
DECLARE @curv Geometry='CircularString(1 1,3 1,3 3)'
DECLARE @Line Geometry='LineString(1 1,3 1,3 3)'
DECLARE @g Geometry = 'COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))';
select @Line [Geometry],'LineString(1 1,3 1,3 3)' [WKT]
union all select @curv.STCurveToLine(),'CircularString(1 1,3 1,3 3)'
union all select @g.STCurveToLine(),'COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))'
範例程式碼 9:建立 CircularString 曲線物件
由於 Denali CTP3 所提供的 Management Studio 尚無法直接呈現 CircularString 空間物件,透過STCurveToLine() 函數,可以將 CircularString 物件轉以許多點定義的小段直線來近似,其執行結果如圖 5 所示:
 image
圖 5:透過 3 個點定義一條曲線
此外,以往 Geography 所定義的空間超過半個地球就會出現錯誤,Denali 後可以支援完整的地球。同時 Denali 也提升了空間索引效能。
參考資料
    下載 SQL Server Code Name "Denali" CTP3:https://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx
    Microsoft® SQL Server® code name ‘Denali’ Community Technology Preview 3 (CTP 3) 功能套件:http://www.microsoft.com/downloads/zh-tw/details.aspx?familyid=a07b5ded-c4bd-4b67-a80a-f5cfb3db9801&displaylang=zh-tw
    TechNet Denali 線上說明:What’s New (Database Engine):http://technet.microsoft.com/en-us/library/bb510411(SQL.110).aspx
    建在 Visual Studio 2010 的資料庫開發專案 Juneau 之 Web 安裝: http://www.microsoft.com/web/gallery/install.aspx?appid=JUNEAU10
    整理 Denali 新功能之連結的 blog  SQL Server“Denali”: CTP3 now available!:http://www.jamesserra.com/archive/2011/07/sql-server-denali-ctp3-now-available/
    SQL Server Denali Samples Readme:http://social.technet.microsoft.com/wiki/contents/articles/sql-server-samples-readme.aspx#Readme_for_Adventure_Works_DW_Tabular_Denali_CTP3

Tags:

SQL Server資料庫 | 胡百敬Byron Hu

評論 (57) -

cours de theatre paris
cours de theatre paris United States
2017/9/30 上午 08:46:14 #

Hey, thanks for the blog article. Really Great.

回覆

nghi duong vung tau
nghi duong vung tau United States
2017/10/6 下午 11:48:19 #

I loved your post.Really looking forward to read more.

回覆

buy hacklinks
buy hacklinks United States
2017/10/9 下午 01:43:06 #

I appreciate you sharing this blog article.Really thank you! Cool.

回覆

sklep z lekami na potencje
sklep z lekami na potencje United States
2017/10/9 下午 03:20:34 #

Looking forward to reading more. Great blog post.Really looking forward to read more. Awesome.

回覆

solarmovie
solarmovie United States
2017/10/10 下午 07:25:37 #

I value the article. Great.

回覆

pirater un compte facebook
pirater un compte facebook United States
2017/10/10 下午 11:50:52 #

Muchos Gracias for your blog.Really looking forward to read more. Fantastic.

回覆

Google cheat 2017
Google cheat 2017 United States
2017/10/12 下午 08:15:38 #

Thanks-a-mundo for the article post.Really looking forward to read more. Keep writing.

回覆

dragon city hack no root
dragon city hack no root United States
2017/10/15 下午 02:59:14 #

Very neat blog post.Much thanks again. Great.

回覆

omega xl
omega xl United States
2017/10/15 下午 07:40:58 #

Thanks so much for the blog.Really looking forward to read more. Keep writing.

回覆

have a peek at this site
have a peek at this site United States
2017/10/17 下午 02:17:16 #

I value the blog post.Thanks Again. Will read on...

回覆

sletrokor review
sletrokor review United States
2017/10/17 下午 07:49:16 #

I really liked your post.Thanks Again. Want more.

回覆

Opal Skyview
Opal Skyview United States
2017/10/19 上午 05:12:01 #

I really liked your article.Thanks Again. Really Cool.

回覆

VigRx
VigRx United States
2017/10/19 上午 06:53:40 #

Very neat blog post.Much thanks again. Fantastic.

回覆

visit their website
visit their website United States
2017/10/19 下午 05:44:00 #

wow, awesome blog article. Awesome.

回覆

pure slim 1000 review
pure slim 1000 review United States
2017/10/20 上午 03:14:48 #

A round of applause for your article.Really thank you! Fantastic.

回覆

vung tau melody
vung tau melody United States
2017/10/21 上午 02:58:00 #

Fantastic blog post.Really thank you! Awesome.

回覆

prix carte grise
prix carte grise United States
2017/10/21 上午 06:35:57 #

Wow, great blog article.Much thanks again. Really Great.

回覆

elake
elake United States
2017/10/21 下午 05:00:10 #

I truly appreciate this article.Really looking forward to read more. Want more.

回覆

Turbotax customer service
Turbotax customer service United States
2017/10/24 上午 10:53:27 #

I think this is a real great blog post.Much thanks again. Fantastic.

回覆

can ho vung tau
can ho vung tau United States
2017/10/28 上午 10:04:48 #

I think this is a real great article post.Thanks Again. Want more.

回覆

EZ Battery Reconditioning
EZ Battery Reconditioning United States
2017/10/30 上午 08:57:11 #

Im thankful for the blog. Keep writing.

回覆

plock
plock United States
2017/10/30 下午 04:43:09 #

Very informative blog article.Thanks Again. Great.

回覆

phentaslim
phentaslim United States
2017/11/3 下午 01:29:13 #

I appreciate you sharing this article.Much thanks again. Fantastic.

回覆

natural remedy spinal stenosis
natural remedy spinal stenosis United States
2017/11/15 上午 05:26:46 #

Great blog post.Thanks Again. Awesome.

回覆

avocat criminel quebec
avocat criminel quebec United States
2017/11/16 下午 04:04:47 #

Say, you got a nice post.Really looking forward to read more.

回覆

http://marsh.promosijakarta.com/
http://marsh.promosijakarta.com/ United States
2017/11/17 下午 02:33:24 #

Really enjoyed this blog post.Really looking forward to read more.

回覆

minecraft hamachi tutorial
minecraft hamachi tutorial United States
2017/11/22 上午 12:32:57 #

I appreciate you sharing this article.Really looking forward to read more. Really Cool.

回覆

fashion
fashion United States
2017/11/23 下午 07:26:56 #

Appreciate you sharing, great blog.Really looking forward to read more. Will read on...

回覆

Seo Services In New Zealand
Seo Services In New Zealand United States
2017/11/25 下午 04:26:21 #

I cannot thank you enough for the post.Really thank you! Cool.

回覆

Chad Boonswang and Jeffrey Goodman
Chad Boonswang and Jeffrey Goodman United States
2017/11/26 下午 03:37:38 #

I loved your blog post.Thanks Again. Much obliged.

回覆

Chad Boonswang SEO
Chad Boonswang SEO United States
2017/11/26 下午 09:35:50 #

I think this is a real great article post.Thanks Again.

回覆

scammer wreckers
scammer wreckers United States
2017/11/29 下午 02:00:46 #

Very neat article post.Much thanks again. Great.

回覆

can ho 4 mat tien
can ho 4 mat tien United States
2017/11/29 下午 08:30:53 #

I think this is a real great article.Much thanks again. Really Cool.

回覆

Credit Mastery builds business credit
Credit Mastery builds business credit United States
2017/12/3 上午 02:24:30 #

Awesome blog article.Really thank you! Want more.

回覆

A round of applause for your article.Thanks Again. Great.

回覆

Enjoyed every bit of your blog article.Really thank you! Want more.

回覆

important site
important site United States
2017/12/14 下午 01:51:02 #

Appreciate you sharing, great post.Really looking forward to read more.

回覆

Christmas Music
Christmas Music United States
2017/12/14 下午 08:18:28 #

I loved your article.Much thanks again.

回覆

canon driver software
canon driver software United States
2017/12/16 下午 03:34:08 #

Awesome blog.Really thank you! Really Cool.

回覆

lose weight
lose weight United States
2017/12/16 下午 09:47:27 #

I loved your blog.Thanks Again. Will read on...

回覆

A big thank you for your blog. Great.

回覆

Planning
Planning United States
2017/12/17 下午 03:17:10 #

I really like and appreciate your post.Really looking forward to read more. Really Great.

回覆

review
review United States
2017/12/17 下午 10:17:30 #

Awesome article.Much thanks again.

回覆

online jobs
online jobs United States
2017/12/20 下午 04:25:31 #

I appreciate you sharing this blog post.Much thanks again. Want more.

回覆

canon drivers
canon drivers United States
2017/12/23 上午 11:43:49 #

Thanks so much for the blog post.Really looking forward to read more. Cool.

回覆

driver hp
driver hp United States
2017/12/25 下午 11:40:32 #

Im obliged for the blog.Thanks Again. Keep writing.

回覆

&#216;&#162;&#219;Œ&#217;†&#217;‡ &#216;&#168;&#216;&#186;&#217;„
آینه بغل United States
2017/12/26 上午 11:28:48 #

Very informative article post.Thanks Again. Cool.

回覆

SOCCER HIGHLIGHTS
SOCCER HIGHLIGHTS United States
2017/12/26 下午 06:06:48 #

I think this is a real great article.Thanks Again. Awesome.

回覆

canon drivers
canon drivers United States
2017/12/27 下午 05:39:41 #

I appreciate you sharing this blog.Really looking forward to read more. Much obliged.

回覆

hp drivers
hp drivers United States
2018/1/2 上午 08:22:53 #

I really liked your post.Really thank you!

回覆

visit this website
visit this website United States
2018/1/2 下午 04:23:05 #

I truly appreciate this blog post.Really thank you! Great.

回覆

Say, you got a nice article.Much thanks again. Want more.

回覆

hp drivers
hp drivers United States
2018/1/3 上午 07:43:53 #

Thanks for the article post.Much thanks again. Great.

回覆

real money online pokies
real money online pokies United States
2018/1/4 下午 06:20:14 #

Thanks so much for the article. Great.

回覆

hp printer driver
hp printer driver United States
2018/1/5 下午 05:09:54 #

I loved your blog article. Will read on...

回覆

colocation miami
colocation miami United States
2018/1/10 下午 12:56:49 #

Thanks so much for the article.Really thank you! Awesome.

回覆

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List