2007年8月30日 星期四

.Net 2.0 使型別接受 null

一般在寫程式的時候, 針對 int 類型的變數, 沒有辦法使其接受 null
所以如果要表現 null 的情況(也就是不指定值), 通常會用絕不會指定的值來區隔
但是如果系統允許因為某些情況無法知道其值且能寫入資料庫, 此時或許就會存入-1, 用來代表其值未知
雖然可以依此規則判斷, 但是這樣會因為個人喜好不同而造成不同結果, 別人要來維護系統會比較困難
此時可以將寫法改為如下(C#)
int? price=null;
也就是在型別後面加上?, 這樣就可以處理 null 囉

原文在此

C# 2.0 泛型簡述

原文在此(其實也是轉貼的)

以前使用ArrayList的時候
無法明確宣告內含物件的類別
使得系統可能造成出錯的情況
且此種狀況只會在執行時期發生
所以不容易處理
現在就不用擔心這種問題啦^_^

2007年8月23日 星期四

移除windows live messenger惱人的廣告

這是我用google找到的方法
雖然不能讓廣告的區塊消失,但至少不會造成有的廣告會使得滑鼠移過去時突然變大甚至發出聲音的困擾
前幾天第一次發生,當時真的有被嚇到,而且還是在辦公室裡面,實在是很機車>"<

2007年8月22日 星期三

ASP.NET使用Office Web Componet處理EXCEL file

開發環境

專案參考COM:Microsoft.Office.Interop.Owc11

若已有EXCEL範本檔則先轉成XML格式後載入並加入其他資料
程式範例如下(VB.NET)
Dim xlsheets As New Owc11.SpreadsheetClass()
xlsheets.XMLURL = Server.MapPath(".\ExcelFiles") & "\" & "交通住宿名單.xml"
之後便可對xlsheets物件進行操作
例如要處理sheet1則使用下列語法
Dim xlsheet As xlsheets.Worksheets.Item("sheet1")

如果要將最後的結果直接傳送到瀏覽器上讓使用者開啟或存檔, 則可以使用下面的做法
Response.Clear()
Response.Buffer = True
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5")
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "交通住宿名單.xml")
Response.ContentType = "application/vnd.ms-excel"
Response.Write(xlsheets.XMLData)
Response.End()

伺服器端

安裝Office Web Componet

優缺點

相對於前面某篇文章提到使用Microsoft Excel 11.0 object library的方式來處理的好處是不會造成excel處理程序殘留
且伺服器端不需要太複雜的環境設定
並且我實際使用Microsoft Excel 11.0 object library來開發時會出現不穩定的現象
有時候報表很順利的產出, 有時候卻因為時間太久造成無法顯示網頁的狀況
且微軟亦不建議使用office object來開發web程式
因為會有很多無法預期的現象, 例如處理程序無法釋放就是其中之一

缺點則是不支援部分格式化功能, 如自動換行、自動調整列高...
不過我發現有一個方法可以解決無法自動換行的問題
把xlsheets.XMLData中包含ss:alignment的字串取代成ss:alignment wraptext="1"
不過無法自動調整列高的問題無法比照辦理,殘念...

寫入cell需注意若欄位為字串型態但內容皆為數字則應於左邊加上"\t"
以確保不會被自動識別為數值型態而被自動格式化(例如去除左邊的0)
若為DateTime型態則需先轉為字串型態=>((DateTime)value).ToString("yyyy/MM/dd")

2007年8月16日 星期四

製作.chm格式說明文件for .NET程式

微軟提供Sandcastle可將程式碼中以"///"開頭的文件說明轉出成為已編譯的 HTML Help 檔案(.chm), 但是必須要執行多達12個很複雜的命令列指令才能完成, 實在是讓人倒退三步, 因此我另外又找到SandcastleGUI這個前端介面, 只需要依照畫面要求輸入正確的資料後便能一鍵產生最後的.chm檔案

若在命令視窗出現錯誤則必須檢查專案的參考dll是否正確, 重新建置參考專案或將copy local設為true看是否問題能解決

SandcastleGUI針對輸入資料的檢查及注意事項都會提示使用者, 值得我們學習, 第一次看到作者把肖像放在畫面上, 不由得會心一笑 :)

2007年8月15日 星期三

在ASP.NET中撰寫EXCEL 2003報表程式

開發環境
  • 專案參考COM元件:Microsoft Excel 11.0 object library

網站伺服器

  • 安裝office 2003
  • 安裝Office 2003 Primary Interop Assemblies redistributable package
  • 將會產生excel file的目錄設定安全性允許everyone write
  • administrative tools > component service > computer > my computer > DCOM config > microsoft excel 應用程式 > 右鍵內容 > security

launch and activation permissions: 改為customize 並加入everyone將所有local權限設為allow

access permissions: 改為customize 並加入everyone將所有local權限設為allow

2007年8月10日 星期五

ASP.NET 2.0 資料庫連結字串用法

在ASP.NET 2.0中,使用了一种在运行时解析为连接字符串值的新的声明性表达式语法,按名称引用数据库连接字符串。连接字符串本身存储在 Web.config 文件中的 <connectionStrings> 配置节下面,以便易于在单个位置为应用程序中的所有页进行维护。

  范例程序代码如下:

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="Pubs" connectionString="Server=localhost;
Integrated Security=True;Database=pubs;Persist Security Info=True"
providerName="System.Data.SqlClient" />
<add name="Northwind" connectionString="Server=localhost;
Integrated Security=True;Database=Northwind;Persist Security Info=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<pages styleSheetTheme="Default"/>
</system.web>
</configuration>
  程序代码说明:在上述范例的程序代码中,我们在Web.Config文件中的<connectionStrings> 配置节点下面设置了两个数据库连接字符串,分别指向pubs和Northwind两个示例数据库。注意,在2.0中引进了数据源控件,例如SqlDataSource 控件,我们可以将SqlDataSource 控件的 ConnectionString 属性被设置为表达式 <%$ ConnectionStrings:Pubs %>,该表达式在运行时由 ASP.NET 分析器解析为连接字符串。还可以为SqlDataSource 的 ProviderName 属性指定一个表达式,例如 <%$ ConnectionStrings:Pubs.ProviderName %>。其具体的用法和新特征将在以后的章节进行详细的介绍。现在有个基础的了解即可。

  当然,我们也可以用下面的方式从配置文件直接读取数据库连接字符串。首先我们需要引用using System.Web.Configuration命名空间,该命名空间包含用于设置 ASP.NET 配置的类。

string connectionString =ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
  程序代码说明:在上述范例的程序代码中,我们可以利用ConnectionStrings["Northwind"]读取相应的Northwind字符串。同理以可以利用ConnectionStrings["Pubs"]读取相应的Pubs字符串。

Entity Framework 建立新物件並儲存後馬上取得關聯資料

使用 CreateProxy 建立物件,不要直接 new var newmodel = _contextXXX.CreateProxy<yyy>(); ... _contextXXX.yyy.Add(newmodel); await _contextXXX.SaveC...