2010年7月31日 星期六

在VS 2010中使用不同的.NET Framework 版本 (2)

使用VS 2010開發並維持舊版本.NET 3.5專案


本文介紹如何維持舊版本.NET 3.5專案在VS 2010開發環境中繼續開發,我們使用Visual Web Developer 2010 Express。首先我們使用VS 2008建立一個版本為.NET 3.5的專案,其中含有一個Web 專案(WebAP1)與類別專案(myClass),如下圖:




開啟Visual Web Developer 2010 Express->點選Open Project->選擇剛才建立的VS2008專案,系統會自動出現如下視窗:





我們要選擇「Finish」,因為我們不要轉換成.NET 4.0版本,我們還是要在VS2010中維持.NET 3.5的版本,接著會顯示轉換已完成訊息,我們可以選擇「Close」將視窗關閉。


在方案視窗->選擇WebAP1->選擇內容,我們可以看到這個專案仍舊維持.NET 3.5的版本。





但是另外我們選擇一個專案myClass->選擇內容,我們可以看到這個專案會顯示.NET 4.0的版本,不要緊張,因為我們剛才沒有轉換任何一個專案,所以我們只要將內容頁籤中的版本選回.NET 3.5即可。




然後接著系統會出現下面的畫面,我們可選擇「Yes」讓該myClass專案被重新整理一次。



完成以上步驟,即可讓整個專案,包含WebAP1與myClass這個兩個專案都在VS2010中維持原來的.NET 3.5版本。若有多個類別專案,也是可以逐一在該類別的專案內容去設定.NET Framework的版本。接著,檢查這個專案的web.config中,可看到所有引用到.NET Framework元件的都還是維持在.NET 3.5的版本。



文章分類:VS2010


2010-07-31 星期六

在VS 2010中使用不同的.NET Framework 版本 (1)

轉換.NET 3.5版本到.NET 4.0版本 + 使用VS 2010開發


本文介紹不同版本(.NET 2.0~.NET 3.5)如何在VS 2010開發環境中使用與設定。我們使用Visual Web Developer 2010 Express,首先我們建立一個VS 2008的專案(版本為.NET 3.5),其中含有一個Web 專案(WebAP1)與類別專案(myClass),如下圖:...MORE



2010-07-31 星期六

在VS 2010中使用不同的.NET Framework 版本 (2)

使用VS 2010開發並維持舊版本.NET 3.5專案

本文介紹如何設定維持舊版本.NET 3.5專案在VS 2010開發環境中繼續開發...MORE


在VS 2010中使用不同的.NET Framework 版本 (1)

使用VS 2010開發並轉換.NET 3.5專案到最新的.NET 4.0專案


本文介紹不同版本(.NET 2.0(含)以後)如何在VS 2010開發環境中使用與設定,我們使用Visual Web Developer 2010 Express。首先我們利用VS2008建立一個版本為.NET 3.5的專案,其中含有一個Web 專案(WebAP1)與類別專案(myClass),如下圖:




開啟Visual Web Developer 2010 Express->點選Open Project->選擇剛才建立的VS2008專案,系統會自動出現如下視窗,我們要選擇「Next」,因為我們要轉換成.NET 4.0版本:




系統詢問是否建立備份,我們這裡選擇「No」不建立備份,並且選擇「Next」繼續執行轉換步驟。




接著可看到系統正在進行轉換,然後出現下圖視窗,我們選擇「Yes」讓系統將其它的專案(如本範例中的myClass類別專案)也一併轉成.NET 4.0



最後系統顯示轉換完成,如下畫面:




轉換好後我們打開方案總管,看到專案內容還是跟VS2008中看到的大同小異,如下畫面:



接著我們查看作業系統檔案總管中的專案起始檔,可看到已經變成VS 2010,而且Web.config中也變成VS 2010預設相當簡潔的版本,並且引用VS 2010中.NET 4.0版本相關元件,如下畫面:






我們可順利將專案進行compile,並正確顯示這個網站,如下畫面:



2010年7月26日 星期一

使用SET LANGUAGE 的SQL 語法彈性指定不同國家的日期語言

在網站運行時,我們想要提供一個目前日期的顯示文字,而且可以彈性的指定不同國家的日期語言,我們可以使用SET LANGUAGE這個SQL語法。首先,我們先看看如何查詢不同國家別的日期語言(如星期幾與月份的文字),我們可使用下列SQL語法查詢出可用的日期語言相關對應,這裡我們只示範查3個欄位:


select [name],alias,days from sys.syslanguages

查詢出來的資料庫內系統語言設定如下,可以看到不同語言名稱(name欄位與alias欄位)與其相對應的星期語言(days)顯示,當然還有其他欄位如months與shotmonths等等欄位可供查詢。





接著,我們要達成在程式執行的時候,動態產生不同國家的日期語言,我們可以使用下列方式的SQL語法,如我們要設定「繁體中文」的日期語言對應,我們可使用上面剛剛提到的語法,去查詢出來「繁體中文」的name或alias這兩個欄位後,執行如下的SQL語法:


SET LANGUAGE 'Traditional Chinese'


接下來我們可以加些變化,例如我們設定成「日文」日期語言,並且輸出今天的星期與「dd mm yyyy」的日期格式編號106(日期和時間樣式請參考這裡),SQL語法如下:


SET LANGUAGE 'Japanese'
SELECT DATENAME(Weekday, GETDATE()) AS Weekday
SELECT DATEPART(Weekday, GETDATE()) AS Weekday
SELECT CONVERT(nvarchar(11),GETDATE(),106) AS Japanese_Datetime
GO


我們可以看出今天為星期一,執行該語法後,已經輸出成日文的「星期一」=「月曜日」。



動態的指定輸出的日期語言,使得我們可更有彈性的客製化各種不同國家的日期時間語言,增加網頁呈現的多樣性。

2010年7月24日 星期六

文章分類:SQL

2011-2-26 星期六

T-SQL ADD/DROP Default Value

本篇文章主要是要透過撰寫T-SQL Script去異動一個欄位的預設值(Default Value)。假設我們在Northwind這個資料庫中,有一個Table名為TestTable,其中有兩欄位MachineID與Name,如下圖:...MORE



2011-1-20 星期四

利用SQL Server 工具自動產生提升SQL執行效能的的Index語法(Auto Create SQL Script of Index - Database Engine Tuning Advisor)

在提升網站速度這個議題上,資料庫能夠迅速回應前端網友的需求,也是一個很重要的部份,良好的索引(Index)設計,通常也可提升資料庫的處理速度,本篇文章即是使用MS SQL Server 2005中的「Database Engine Tuning Advisor」這個工具,進行提升SQL 語法執行效能。...MORE



2010-10-3 星期日

Remove Prevent Saving Changes in MS SQL Server 2008 R2

當我們安裝好MS SQL Server 2008 R2時,建立了一個表(Table)如下圖。如同所有到達完美之路的過程,總是需要調整自己,此時我們還需要修改這個Table的某一個欄位,如下圖我們將CategoryName這個欄位改成准許Null的欄位,改好後,如下圖


總如往昔我們總經驗過的事情,到達完美的路上,總也是會遇到挫折,我們按下儲存時,
哇~出現了下列的錯誤訊息,告知我們目前一旦建立好Table後,預設是不能再修改這個Table的Schema。我們只是忠實的告訴資料庫,嘿~你錯了!但是像科幻電影般,系統也有了基本的智慧去告訴你,嗨~你也錯了,你不能做這件事。
...MORE


2010-07-27 星期二

使用SET LANGUAGE 的SQL 語法彈性指定不同國家的日期語言

在網站執行時,我們想彈性的指定不同國家的日期語言,我們可以使用
SET LANGUAGE這個SQL語法。首先,我們先看看如何查詢不同國家別的日期語言(如星期幾與月份的文字),
我們可使用下列SQL語法查詢出可用的日期語言相關對應,這裡我們只示範查3個欄位:

select [name],alias,days from sys.syslanguages
...MORE


2010-07-24 星期六

利用ROW_NUMBER()來進行排序

在MS SQL Server 2005之後有一個指令ROW_NUMBER(),可以讓我們很方便得來對資料進行分組,這應用在很多方面上...MORE


SQL 利用ROW_NUMBER()來進行排序

在MS SQL Server 2005之後有一個指令ROW_NUMBER(),可以讓我們很方便得來對資料進行,分組,這應用在很多方面上,如將資料在資料庫中每次拋出一頁10筆的資料給網頁呈現,以提昇網頁速度,而不是將全部的資料拋出去,然後再去分一頁10筆。

在這裡,我們將ROW_NUMBER()做另外一種應用,就是拿來排序,並自動產生1,2,3...等等的這種序號的欄位,當然,所有資料也會依照你想遞增排序(ASC)或是遞減排序(DESC).

這裡我們示範的範例Table結構如下,有收入(Revenue)與業績目標(Goal)等欄位,如下圖:

create table #TmpScore
(
    SalesName nvarchar(10)     default(''),
    Revenue int default(0),
    Goal int default(0)
)

利用ROW_NUMBER()指令來產生排序編號欄位的script,排序欄位我們給它一個名稱叫做sort,如下:

SELECT * FROM
(
    SELECT * ,ROW_NUMBER() OVER (ORDER BY CASE WHEN Goal=0 THEN 0 ELSE Revenue/Goal END DESC) AS sort FROM #TmpScore
) #TmpScore

下圖左側是尚未使用ROW_NUMBER()前,只是將所有資料Select查詢出來,下圖右側則是套用我們上面的script所執行出來的結果,可以看出已經自動按照業務員的業績排列,業績達成率越高的,則排名越高:

2010年7月21日 星期三

使用Entity Framework設定Complex Types-以MVC中使用stored procedure為範例

在MVC使用Entity Framework來存取資料庫中的Stored Procedure應用中,若是遇到Stored Procedure回應出來的是一組複雜資料欄位,而這組資料欄位是目前專案中沒有一個類別與之相對應,此時,我們可以另外建立一個新的類別,也可以使用Entity Framework中的Model Browser視窗中的Complex Types來建立這個新的資料欄位組合,建立好後,就如同一個資料Model一樣,可以在專案中的Controller或是View,或是別的ViewModel中拿來使用,本文即說明如何利用Complex Types來建立這個新的資料欄位組合,Complex Types的點選位置如下圖示:


1.我們直接使用Northwind資料庫中的下面這個stored procedure來說明,假設我們透過這個stored procedure,我們需要產生這些欄位,而這些欄位並不是直接對應到某一個資料庫的Table或是專案程式內的類別,那我們可以透過這Complex Types來建立這些stored procedure所抓回來的程式欄位。

ALTER PROCEDURE [dbo].[CustOrdersDetail] @OrderID int
AS
SELECT ProductName,
        UnitPrice=ROUND(Od.UnitPrice, 2),
        Quantity,
        Discount=CONVERT(int, Discount * 100),
        ExtendedPrice=ROUND(CONVERT(money, Quantity *
                        (1 - Discount) * Od.UnitPrice), 2)
FROM Products P, [Order Details] Od
WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID

2.我們利用Complex Types中的Add功能來產生一個新的Complex Types,並給予一個名稱「CustOrdersDetail」。



3.接著我們就建立「CustOrdersDetail」這個Complex Types下面所屬的每一個欄位,基本上我們對應到我們上面所提到那個stored procedure所查詢出來的每個欄位的資料型態,當然若是原來資料型態是decimal,我們這裡相對應的欄位就不可以為double.其他的例子也一樣,若是原來資料庫中欄位是smallint,則我們就不可設為int,最後程式在compile的時候,會顯示錯誤訊息。我們設定好後,也可點選每個欄位,然後選擇「屬性」去修改。



4.在Entity Framework應用中,我們還需為這個資料庫中的stored procedure建立一個Function Import(可查閱文章:EF與Stored procedure的Output),我們在這裡建立名稱為「FI_CustOrdersDetail」的Function Import,並且在Function Import設定視窗中,下拉並指定產生的資料型態為「CustOrdersDetail」這個Complex Types。建立好這個Function Import後,可供我們在MVC專案中去呼叫使用。


5.當我們建立好「CustOrdersDetail」這個Complex Types後,我們這裡示範在MVC專案中的Controller直接呼叫使用,將資料透過Function Import取回來,並放到List<CustOrdersDetail>這個List中,這裡我們在「Browse」這個Action中,先直接放入一個訂單編號10260當作是傳入stored procedure的參數,如下:

public ActionResult Browse()
{
    List<CustOrdersDetail> custOrderDetail = new List<CustOrdersDetail>();
    custOrderDetail = _contx.FI_CustOrdersDetail(10260).ToList();
    return View(custOrderDetail);
}

6.我們透過「Browse」這個Action,把資料庫中透過EF抓到的資料拋到相對應的View上顯示,在這裡我們可以看到,我們建立好「CustOrdersDetail」這個Complex Types後,它就像一個在Model中的類別,我們可以方便的在Controller或是View中使用,執行程式後,我們可看到下面由stored procedure抓來的訂單明細資料:


7.建立Complex Types最大的功用,應該是可讓我們快速的建立一個與「類別」(Class)相似的「型態」(Types),我們不用真的用程式去寫出一個類別,然就可以享受到類別的好處,並且用此Complex Types用來承接Entity Framework中自資料庫抓回來的資料,這個應該是使用Complex Types的一個優點。

2010年7月16日 星期五

如何設定HtmlHelper.GenerateRouteLink、routeName、routeValues與HtmlAttribute

HtmlHelper是MVC中新的而且很好用的物件,我們可以用來產生很多延伸的各種Helpers,其中HtmlHelper.GenerateRouteLink()可以用來產生網頁上很單純Link的HTML碼。


<a href="http://myWebSite/Product/Browse" >產品瀏覽</a>


而本文就是利用HtmlHelper.GenerateRouteLink來達到上述產生Link需求,也藉此說明HtmlHelper.GenerateRouteLink()的使用方式。


Gallardo570-4
From:www.lamborghini.com


在MVC的應用中,我們常會用到需要由程式產生一個Link,而這個Link可由MVC中的Route判別該存取哪一個頁面,例如有一個「賀瑞斯汽車資訊網站」,需要在網頁上產生一個Link,可讓網友點選後,即可連結到產品名稱為Lamborghini的汽車規格資訊頁面。


網址列上我們希望如下顯示:


http://localhost/Product/Details/CarName/Lamborghini


我們當然可以直接以HTML寫成下列的Link:


<a href="http://localhost/Product/Details/CarName/Lamborghini" >藍寶堅尼</a>


但想像一下,假設「賀瑞斯汽車資訊網站」需提供好幾百種車款的詳細資訊,若都是在網頁上直接以HTML寫成好幾百條Link程式碼,這看來不是一件有效率的事,而且維護起來是一件災難。比較適當的方式,就是透過程式與資料庫互動,動態且自動產生很多這類的連結資訊。透過程式與資料庫互動的方法其中之一是我們可以用foreach迴圈方式去讀取資料中Model。CarName的方式,也可以組成很多如下Link,如下。


<a href="http://localhost/Product/Details/CarName/Lamborghini" >藍寶堅尼</a>
網址顯示 http://localhost/Product/Details/CarName/Lamborghini


<a href="http://localhost/Product/Details/CarName/Porsche" >保時捷</a>
網址顯示 http://localhost/Product/Details/CarName/Porsche


另外也可以利用本文所提的HtmlHelper.GenerateRouteLink()的方式,達到上述產生Link需求,尤其是要寫MVC中各種Helpers.GenerateRouteLink()這個方法更是重要。


下面簡單說明GenerateRouteLink所需帶入的各參數與涵義,並舉例說明實際用法讓大家瞭解。


GenerateRouteLink方法


GenerateRouteLink(RequestContext requestContext,
    RouteCollection routeCollection,
    string linkText,
    string routeName,
    RouteValueDictionary routeValues,
    IDictionary(String, Object) htmlAttributes)


下面為GenerateRouteLink需帶入的參數說明,這些來自微軟MSDN文件,不過很可惜,沒有實際範例可供參考,這也是本文想要補足之處。


requestContext
    型別:System.Web.Routing..::..RequestContext
    HTTP 要求的內容。


routeCollection
    型別:System.Web.Routing..::..RouteCollection
    URL 路由的集合。


linkText
    型別:System..::..String
    要顯示的連結文字標題。


routeName
    型別:System..::..String
    用來傳回虛擬路徑之路由的名稱。


routeValues
    型別:System.Web.Routing..::..RouteValueDictionary
    包含路徑參數的物件。


htmlAttributes
    型別:System.Collections.Generic..::..IDictionary<(Of <(<'String, Object>)>)>
    物件,包含項目的 HTML 屬性。


傳回值
型別:System..::..String
HTML 項目,連結至指定的 URL 路由。


重點來了,再提一下,我們是要建立一個HtmlHelpers中的GenerateRouteLink()。如何建立一個HtmlHelpers就暫時不在這裡討論了,大家可到微軟:建立Custom HTML Helpers參考一下基本建立方式。建立HtmlHelpers內的GenerateRouteLink()來自動產生如下這樣的Link,這才是本文所要說明的地方。


http://localhost/Product/Details/CarName/Lamborghini



而每一個參數,我們可實際以下列方式帶入:


requestContext參數:就是指HTTP要求的內容,我們可帶入「helper.ViewContext.RequestContext」。
routeCollection參數:就是指Route的集合,我們可帶入「helper.RouteCollection」,因為這部份是提供給Route使用,故直接帶入這些值即可。
linkText參數:就是Link要出現的文字,在我們「賀瑞斯汽車資訊網站」的例子中,我們要顯示「Lamborghini(藍寶堅尼)汽車規格資訊」這個字串。


string myLinkName= "Lamborghini(藍寶堅尼)汽車規格資訊";


routeName參數:就是我們「必須」寫在Global.asax中,讓網站系統的Route「識別的名稱」,說穿了就是一個字串型態的文字,我們設定如下:


string myRouteName = "CarProducts";


有了這個「識別的名稱」,這樣她(Route)才知道要去使用Global.asax內那組「Route的規則」來處理這條Link要指到哪一個Controller與Action,而在Global.asax內,我們也需加上這組「Route的規則」,讓整串Link產生後,網友在網頁上點選才能真正去執行。這組規則如下。


routes.MapRoute(
    "CarProducts"// Route name
    "Product/Details/CarName/{car_name_id}"// URL with parameters
    new { controller = "Product", action = "Details" } // Parameter defaults
);


routeValues參數:routeValues資料型態是一個<Key,Value>的組合,這個也會在Global.asax中被使用到,就是上述Global.asax中參數car_name_id(就是指Key)與屆時需帶入的資料(就是指Value),以我們「賀瑞斯汽車資訊網站」為例,我們可先直接帶入<"CarName","Lamborghini">這樣的組合。


RouteValueDictionary myRouteValues = new RouteValueDictionary();
myRouteValues.Add("car_name_id",("Lamborghini"));


若是CarName後要帶數值型態的編號:38,也可用下列方式:


myRouteValues.Add("car_name_id",(38));


但是一般我們會自資料庫抓了汽車名稱或編號資料,放入陣列中,讓程式自動產生routeValues中所需的value,如下:


myRouteValues.Add("car_name_id",carNameIDAry[i]);


htmlAttributes參數:就是我們舉例的「http://localhost/Product/Details/CarName/Lamborghini」這個Link要配合名為「car-link-style」的這個cssClass,如下寫法:


IDictionary<string, object> myHtmlAtts= new Dictionary<string, object>();
myHtmlAtts.Add("class", "car-link-style");


或是myHtmlAtts後面直接加上style的各種屬性設定如下寫法:


myHtmlAtts.Add("style", "color:Gray;font-family:Georgia;font-size:20px");


上面已經設定完GenerateRouteLink()所需帶入的各種參數,本範例完整方法與參數呼叫如下,她會回應成一個網頁上的Link字串供網友點選,就是一直在提的「http://localhost/Product/Details/CarName/Lamborghini」。


public static string ShowDetailCar(this HtmlHelper helper)
{
        :
        :
    return HtmlHelper.GenerateRouteLink(helper.ViewContext.RequestContext,
        helper.RouteCollection,
        helper.Encode(myLinkName),
        helper.Encode(myRouteName),
        myRouteValues,
        myHtmlAtts);
}


而上面這個Link產生後,它會對應到Product這個Controller的Details這個Action,在這個Action中,我們可簡單寫成直接給予一個Car的資料,當然Car這個類別須在Models中建立。在正式的網站中,通常Car的資料是從資料庫撈出來的,然後轉成List<Car>的資料.這裡只是示範一筆資料來顯示。注意帶入Details這個Action的參數,名稱要和上述routeValues<Key,Value>參數內的Key值相符合(這裡就是都要名稱為car_name_id),也要和Global.asax內那組我們用到的「識別的名稱」內的參數相同名稱。


public class ProductController : Controller
{
    public ActionResult Details(string car_name_id)
    {
        Car carToDetails = new Car
        {
            CarName = "Lamborghini Gallardo",
            Year = "2004",
            Country = "義大利",
            Exhaust = "4961 cc",
            Speed = "309 km/h"
        };
        return View(carToDetails);
    }
}


實際執行後,自動產生的Link如下第一個圖,點選該Link後,就顯示該車的詳細資料,如下圖二。我們可以看一下圖中網址列的Link,就會直接指到我們本範例中所想建立的「http://localhost/Product/Details/CarName/Lamborghini」這樣型態的連結。


Lamborghini


Lamborghini


小結


網址上顯示「http://localhost/Product/Details/CarName/Lamborghini」這樣的名稱,看來比顯示「http://localhost/Product/Details.aspx?CarName=Lamborghini」還要來得直覺與簡便,這部份也可利用在顯示分頁資料的分頁頁碼字串中,如下:


paging


直覺與相互獨立,這就是ASP.NET MVC2的魅力所在!!

2010年7月12日 星期一

NPOI Create Excel Advice

本文不是要詳細說明NPOI每個屬性的使用方式,而是要說明一些實際製作時注意事項.


基本Style,字型,字大小與框線等格式設定


假設我們最後想要設定的Excel有兩個Worksheet,其中第一個Worksheet看來如下:


xls

NPOI可方便地建立多個Worksheet,當我們要建立多個工作底稿(Worksheet)時,可使用下列方式建立:


HSSFSheet sheetA = workbook.CreateSheet("飛機玩具");
HSSFSheet sheetB = workbook.CreateSheet("積木玩具");

在設定所有格式前,建議先建立字型相關的格式,以方便在該支產生Excel檔案程式稍後要套用到style時可使用到,用下列方式建立:


HSSFFont fontTitle = workbook.CreateFont();
fontTitle.FontName = "Arial";
fontTitle.FontHeightInPoints = 15;
fontTitle.Color = NPOI.HSSF.Util.HSSFColor.BLUE_GREY.index;
fontTitle.Boldweight = 30 * 20;

建立一個名稱為styleTitle的儲存格Style參數,可由該參數設定許多屬性:


HSSFCellStyle styleTitle = workbook.CreateCellStyle();


設定Excel儲存格中的框線,當然也可設定點狀(DOTTED)或是粗框線(DOUBLE):


styleTitle.BorderBottom = CellBorderType.THIN;
styleTitle.BorderLeft = CellBorderType.THIN;
styleTitle.BorderTop = CellBorderType.THIN;
styleTitle.BorderRight = CellBorderType.THIN;

設定Excel儲存格中資料水平與垂直的對齊方式:


styleTitle.Alignment = CellHorizontalAlignment.CENTER;
styleTitle.VerticalAlignment = CellVerticalAlignment.CENTER;

賦予style字型:

styleTitle.SetFont(fontTitle);

另外,我們可以為儲存格設定特殊格式,但首先需建立一個DataFormat參數:

HSSFDataFormat format = workbook.CreateDataFormat();

如何填值到Excel儲存格與套用格式


重點來了,NPOI的儲存格一般而言可存入4種通用格式,分別string、bool、double與datetime等4種格式.字串格式資料不用特別設定,只要使用
sheetA.CreateRow(2).CreateCell(1).SetCellValue("產品資訊")這樣即可.

接著這裡示範三種常常會需要使用到的格式,分別是有逗號區分的數值資料,顯示百分比符號與顯示日期格式.


顯示有逗號區分的數值資料

HSSFCellStyle styleNumeric = workbook.CreateCellStyle();
styleNumeric.DataFormat = format.GetFormat("###,##0");

程式中填入數值的資料時,需將「數值」的資料給予儲存格,而不是給予「字串」格式資料,如下列示範:

sheetA.CreateRow(3);
sheetA.GetRow(3).CreateCell(1).SetCellValue(35666888555);
sheetA.GetRow(3).GetCell(1).CellStyle = styleNumeric;

顯示百分比符號

HSSFCellStyle stylePercent = workbook.CreateCellStyle();
stylePercent.DataFormat = format.GetFormat("#0.00%");

程式中填入百分比的資料時,需將「數值」的資料給予儲存格,而不是給予「字串」格式資料,如下列示範:

sheetA.CreateRow(4);
sheetA.GetRow(4).CreateCell(1).SetCellValue(0.38);
sheetA.GetRow(4).GetCell(1).CellStyle = stylePercent;

顯示日期格式

HSSFCellStyle styleDate = workbook.CreateCellStyle();
styleDate.DataFormat = format.GetFormat("yyyy-mm-dd");

程式中填入日期格式的資料時,需將日期型態的資料給予儲存格,然後再將上述格是賦予給該儲存格,若是填入「字串」格式的日期資料,產生出來的Excel是不會呈現上面設定的「yyyy-mm-dd」日期格式.如下列示範:


sheetA.CreateRow(5);
sheetA.GetRow(5).CreateCell(1).SetCellValue(new DateTime(2010, 7, 12));
sheetA.GetRow(5).GetCell(1).CellStyle = styleDate;

我們也常需要對儲存格做合併,假如我們要合併儲存格A0:B0,並設定一個style參數給合併後的儲存格,需注意每個儲存格(如A0與B0)皆需設定style參數,否則不會有作用.如下設定:

sheetA.AddMergedRegion(new NPOI.HSSF.Util.Region(0, 0, 0, 1));
sheetA.GetRow(0).GetCell(0).CellStyle = styleTitle;
sheetA.GetRow(0).GetCell(1).CellStyle = styleTitle;

最後可經欄寬與列高放到最後再設定,這部份可參考前面所提到的文件:

//列高
sheetA.GetRow(0).Height = 19 * 20;//Excel上列高18.75
sheetA.GetRow(1).Height = 17 * 20;//Excel上列高16.5
//欄寬
sheetA.SetColumnWidth(0, 15 * 256);//Excel上欄寬14.29
sheetA.SetColumnWidth(1, 22 * 256);//Excel上欄寬21.29

NPOI文件資源連結


在下列網址可以查閱到相當豐富的各種NPOI屬性使用說明:


使用NPOI在網站上產生Excel表格資料,即時提供給user,不必再像之前要組很多XML字串,或是使用耗資源的Excel.Applicaton元件.NPOI更可方便的配合物件導向式的寫法,快速的產生豐富格式化後的Excel表格.

2010年7月11日 星期日

拉拉山 2010 夏

7月初到拉拉山住了兩天一夜,多虧老姊資助,住了不錯的小木屋,當然吃水蜜桃是一定要的啦,到處都在賣水蜜桃,有整箱賣,也有論斤賣.
水蜜桃

這裡是中巴陵的小停車場,可以看得很遠.
中巴陵

這棟房子這樣看來很棒,不過我們不是住這裡.
House

小木屋後方的小矮牆,很有英格蘭紅白相間的味道.
wall

我們住的小木屋,一切都很好,就是伙食太貴了,建議可自備食材,向老闆借火爐即可.小木屋中沒空調,入夜後比空調還冷,這裡海拔一千多公尺.
hotel

文章分類 : ASP.NET


2010-12-19 星期日

.NET 4 URL Routing

ASP.NET 4中,有一個新的URL Routing的功能,可讓我們很方便的自由設定我們想要的URL格式,例如:
http://yourWebSite/search.aspx?key=WPF7

透過URL Routing,網址列可變成

http://yourWebSite/search/WPF7


http://yourWebSite/employee.aspx?country=UK&city=London
透過URL Routing,網址列可變成

http://yourWebSite/employee/UK/London


然後利用URL Routing的機制,系統會自動對應與攜帶參數到指定的實際程式中去執行,以下就介紹5種URL Routing的使用方式與範例。...MORE



2010-10-24 星期日

設定Entity Data Source 時發生的error - Unable to load the specified metadata resource

本篇在說明如何使用Dynamic Data 專案預設範本後,如何客製化Error Message。

首先我們建立一個Dynamic Data專案,如下圖:
...MORE


2010-10-20 星期三

ASP.NET 4 Dynamic Data / Scaffolding Web Application Sample

最近梅姬(Megi Typhoon 2010/10/16)颱風號稱是破表的18級風,而且有人說根本就是批著颱風外衣的超級龍捲風,NASA下面這張圖清楚看到粗壯的颱風眼。這跟我們這個主題也有點小關係,我們也期望ASP.NET Dynamic Data 也是一個威力強大新的且快速的動態呈現資料的方式。

From:http://www.nasa.gov

ASP.NET Dynamic Data可自動且輕鬆的建立由資料驅動的Web應用程式,配合啟用Scaffolding機制,可不必一直再重覆開發維護資料的網頁,有關Dynamic Data架構簡單的說明可區分為三層:

1.展示層:如使用Edit/Add等等Template來呈現資料給使用者。
2.資料層:如建立自訂的資料結構,或是設定ASP.NET的資料來源控制項。
3.資料對應層:如使用Entity Framework / LINQ to SQL 對應到資料庫的各種資料Table。


...MORE


2010-07-13 星期二

NPOI Create Excel Advice

本文不是要詳細說明NPOI每個屬性的使用方式,而是要說明一些實際製作時注意事項.


基本Style,字型,字大小與框線等格式設定


假設我們最後想要設定的Excel有兩個Worksheet,其中第一個Worksheet看來如下:


xls

...MORE


2009-11-22 星期日

ObjectDataSource配合Gridview來達成手動分頁完整範例

    網站的程式,常常需要將資料自資料庫中抓取出來後,顯示在user端並且提供分頁的功能,讓user可以方便的到想要看到資料的那一頁。但是若是以SqlDataSource的方式,抓取資料後,拋給前端顯示的aspx程式,通常只能依據使用者提供的條件查詢到資料後,全部拋給aspx程式,然後根據Gridview的[AllowPaging]設定,提供分頁的功能,但是假設查到1000筆資料,若是一頁顯示10筆資料,使用SqkDataSource這種方式,若沒有特別處理自資料庫抓出來的筆數,仍然會將這1000筆資料,一次拋給apsx程式,然後再顯示一頁10筆的方式給user瀏覽。一次抓出大量且使用者暫時不會看到的資料,對於網站伺服器而言是很大的負荷,瀏覽人數少的時候,可能這種負荷看不出來,但是當瀏覽人數越來越多時,網站存取資料的回應速度就會明顯的下降。...MORE


2009-11-16 星期一

ASP.NET C#如何動態產生GridView控制項與資料列

在這裡,我們想要傳入一個DataTable,然後動態產生一個GridView,並且設定各種CSS給這個GridView。

步驟一:

首先我們可以在網頁上這樣描述,先設定一個Label,用來顯示發生錯誤時的訊息。接下來建立一個Panel,這個Panel就是等一下動態產生出來的GridView要擺放的位置:

<asp:Label ID="lbl_ErrMsg" runat="server" />
<asp:Panel ID="pnl_data" runat="server" />
...MORE

文章分類 : Travel

2010-07-12 星期一
2010 夏 拉拉山
7月初到拉拉山住了兩天一夜,多虧老姊資助,住了不錯的小木屋,當然吃水蜜桃是一定要的啦,到處都在賣水蜜桃,有整箱賣,也有論斤賣.
...MORE
2009-11-26 星期四
香港旅遊新景點 馬灣挪亞方舟公園
    香港馬灣挪亞方舟公園(挪亞公園網站)是一個新完工的公園,2009年8月27日這天剛好陽光普照,微風中依稀聞到海風些許鹹味,帶著老婆女兒,踏上這個計畫已久的挪亞方舟公園之行。馬灣地理位置在香港島西北方青馬大橋附近,在大嶼山和青衣之間。

    怎麼去呢?因為時間上還算悠閒,故就晃啊晃地到紅勘站,利用新蓋好的紅勘站到南昌站這段地鐵,直接搭西鐵線到「荃灣西鐵站」不用中途換地鐵線。最後到「荃灣西鐵站」後,出地鐵站後右轉,馬上可以看到珀麗灣的渡輪。渡輪費用約為8元港幣左右(小孩4元),但要先看好渡輪來回時間,免得面對茫茫大海枯等渡輪。可以参考港鐵網站



2010-07-10 星期六

ADO.NET Entity Framework 透過有output值的Stored Procedure存取資料庫資料

ADO.NET EntityFramework 透過有output值的Stored Procedure存取資料庫資料,就如一般微軟文件所提到,EntityFramework要與Stored Procedure配合可透過VS開發環境中的Model Browse內設定一個Function Import,給與這個Function Import一個名稱,並指向我們的stored procedure,然後在程式中存取該Function Import來完成資料存取.


但是若是我們寫好的Stored Procedure有output值,我們在EntityFramework的程式中,應該如何取回這個output值呢?以下我們就製作一個簡單的例子來說明這個需求.....繼續閱讀

文章分類 : ADO.NET Entity Framework



2011-1-20 星期四

Entity Framework Code First 應用中如何撰寫Connection String

Entity Framework Code First 目前為CTP5版本這種方法,讓我們使用Entity Framework時,不用再產生一個EF檔案,可以藉由將EntityFramework.dll加入參考(Add reference),從此後,我們操作Entity Framework就好向操作一般元件一樣方便,當然,我們使用EF就是要存取資料庫中的資料,無論是使用SQL Server Compact Edition 4SQL Server Express或是正式的SQL Server版本,都需要加上一段ConnectionString。....MORE




2010-12-14 星期二

EntityFramework.dll CTP 5 release

這邊公告一個消息,.NET最新使用Entity Framework方式(現在很多Entity Framework的書我看又要丟掉,然後重寫了)。

微軟會出一個EntityFramework.dll的元件版本,之後使用.NET C#程式的一般OO程式寫法,就可以直接套用EntityFramework的方式存取資料庫。不用像現在要先連好資料庫,然後去create 一個EntityFramework的*.edmx檔案。

....MORE



2010-10-21 星期四

設定Entity Data Source 時發生的error - Unable to load the specified metadata resource

有時我們在建立好Entity Data Source控制項與Entity Framework模型設定後,如下圖:


準備要去設定Entity Data Source控制項的各項屬性資訊時,會遇到一個錯誤訊息

Unable to load the specified metadata resource

...MORE



2010-09-9 星期四

MVC專案中常見的Entity Framework 資料庫欄位型態設定錯誤(column type error)與更正方式

當我們在MVC專案中,已經設定好了Entity Framework,也寫好了MVC程式,執行Compile整個專案,結果我們發現VS 2010告訴我們出了一點錯誤,如下圖,初步看來,是資料庫的Log這個Table的RecordID這個Int且是自動編號的欄位,我們卻設成String型態了,所以資料無法新增到Log這個Table中。...MORE


2010-08-10 星期二

在Entity Framework應用中善用ICollection介面中的判斷方法Any()

我們使用ADO.NET Entity Framework 等ORM(Object Relation Model)的方式自資料庫中存取資料時,常會遇到若存取結果是有資料時,我們要進行一些A處理,而沒有任何資料時,我們則進行B處理,我們可以,但最好不要使用直接使用ICollection介面中的count()方法來進行是否有回傳任何資料項目的判斷...MORE



2010-07-21 星期三

使用Entity Framework設定Complex Types-以MVC中使用stored procedure為範例

在MVC使用Entity Framework來存取資料庫中的Stored Procedure應用中,若是遇到Stored Procedure回應出來的是一組複雜資料欄位,而這組資料欄位是目前專案中沒有一個類別與之相對應,此時,我們可以另外建立一個新的類別,也可以使用Entity Framework中的Model Browser視窗中的Complex Types來建立這個新的資料欄位組合,建立好後,就如同一個資料Model一樣...MORE



2010-07-10 星期六

ADO.NET Entity Framework 透過有output值的Stored Procedure存取資料庫資料

ADO.NET EntityFramework 透過有output值的Stored Procedure存取資料庫資料,就如一般微軟文件所提到,EntityFramework要與Stored Procedure配合可透過VS開發環境中的Model Browse內設定一個Function Import,給與這個Function Import一個名稱,並指向我們的stored procedure,然後在程式中存取該Function Import來完成資料存取.

但是若是我們寫好的Stored Procedure有output值,我們在EntityFramework的程式中,應該如何取回這個output值呢?以下我們就製作一個簡單的例子來說明這個需求...MORE

2010年7月10日 星期六

ADO.NET Entity Framework 透過有output值的Stored Procedure存取資料庫資料

ADO.NET EntityFramework 透過有output值的Stored Procedure存取資料庫資料,就如一般微軟文件所提到,EntityFramework要與Stored Procedure配合可透過VS開發環境中的Model Browse內設定一個Function Import,給與這個Function Import一個名稱,並指向我們的stored procedure,然後在程式中存取該Function Import來完成資料存取.


但是若是我們寫好的Stored Procedure有output值,我們在EntityFramework的程式中,
應該如何取回這個output值呢?以下我們就製作一個簡單的例子來說明這個需求.(本文關鍵設定在5-3小點,若不想看完整範例可直接跳到5-3小點查閱)


1.我們使用Northwind資料庫製作一個下拉選擇控制項與一個基本的Form,可讓user選擇一個Friend的資料後,編輯這位Friend的每個欄位,然後按下儲存按鍵後回存到資料庫中.


2.本次我們會用到的Friend每個欄位型態大小如下:


3.本次我們會用到的Stored Procedure名稱為sp_friend_update,script如下:

-- =============================================
-- Author: horace
-- Create date: 20100511
-- Description: update a friend
-- =============================================
ALTER PROCEDURE [dbo]. [sp_friend_update]
@Seq int,
@FirstName nvarchar(50),
@LastName nvarchar(50),
@Age int,
@Birthday datetime,
@Salary numeric(10,2),
@Email nvarchar(100),
@PhotoPath nvarchar(50),
@returncode int output
AS
BEGIN
  SET @returncode=1
  IF (SELECT COUNT(*) FROM Friends WHERE Seq = @Seq) > 0
    BEGIN
      UPDATE Friends SET FirstName = @FirstName,
          LastName = @LastName,
          Age = @Age,
          Birthday = @Birthday,
          Salary = @Salary,
          Email = @Email,
          PhotoPath = @PhotoPath
        WHERE Seq = @Seq
      SET @returncode=0--success
    END
  ELSE
    BEGIN
      SET @returncode=2--No data exist
    END
END

4.我們要開始在VS.NET 2010 Express開發環境中設定Function Import:
4-1假設我們已經建好了一個ADO.NET Entity Data Model名稱為NorthWind.edmx

4-2在開發環境中打開NorthWind.edmx,並點選右側的Model Browser視窗->點選NorthwndModel->點選EntityContainer:NorthwindEntities->點選Function Import->Add Function Import


4-3在Add Function Import對話方塊中,分別填入與選擇下列三項資訊:

Function Import Name:spEditFriend
Stored Procedure Name:sp_friend_update(下拉選擇我們要的stored procedure)
Returns a Collection Of:None

因為我們的stored procedure並不是回應出一群資料,而是一個整數型態的數值,故我們選擇None.設定好Function Import後,我們就可以在程式中使用剛剛打入的spEditFriend這個名稱來更新資料.


5.ASP.NET程式中:
5-1:可透過下列程式,抓取下拉選擇控制項中的資料,讓user可下拉選擇要更新資料的Friend:

using (NorthwindEntities NWContext = new NorthwindEntities())
{
    var friends = from s in NWContext.Friends
          selec new { Seq = s.Seq, FirstName = s.FirstName };
    if (friends.Any())
    {
        ddlSeq.DataSource = friends;
        ddlSeq.DataTextField = "FirstName";
        ddlSeq.DataValueField = "Seq";
        ddlSeq.DataBind();
        ListItem list = new ListItem("==choice==", "");
        ddlSeq.Items.Add(list);
        ddlSeq.SelectedValue = "";
    }
}


5-2:我們選擇一個Friend後,可透過下列程式,抓取這個Friend的全部資料,並顯示在網頁Form上,已供user修改

Friend friend;
int selSeq = Convert.ToInt32(ddlSeq.SelectedValue);
using (NorthwindEntities NWContext = new NorthwindEntities())
{
    friend = (from f in NWContext.Friends
            where f.Seq == selSeq
            select f).First();
}

5-3:修改好後,按下確認按鍵,我們執行回存到資料庫的程式碼如下,這裡我們分別處理stored pocedure output的三種值,並將這三種狀況其中之一顯示在網頁的label控制項上面,請注意spEditFriend是上面我們建立的Function Import的名稱,而其後的叁數分別是要傳送到stored precedure內的,最後一個就是承接output出來的叁數,我們拿這個叁數的值來進行儲存後的各種狀況判斷判斷:

using (NorthwindEntities NWContext = new NorthwindEntities())
{
    try
    {
        //Function Import的return type要設為None
        DateTime birthday = (TxBirth.Text == "") ? DateTime.Now : Convert.ToDateTime(TxBirth.Text);
        ObjectParameter returnCode = new ObjectParameter("returncode", typeof( Int32));
        NWContext.spEditFriend(Convert.ToInt32(TxSeq.Text),
            TxFN.Text,
            TxLN.Text,
            Convert.ToInt32(TxAge.Text),
            birthday,
            Convert.ToDecimal(TxSalary.Text),
            TxMail.Text,
            TxPath.Text,returnCode);
        switch (returnCode.Value.ToString())
        {
            case "0": Lb2.Text = "Success"; break;
            case "1": Lb2.Text = "Edit record failure or invalid format"; break;
            case "2": Lb2.Text = "No data exist"; break;
        }
    }
    catch (Exception ex2)
    {
        Lb2.Text = ex2.Message;
    }
}

6.執行程式結果如下:
當user修改完畢後,回存到資料庫後,會顯示success的字眼,這是由stored procedure的output值回傳到程式中判斷而來的.