ADO.NET 於DataAdapter新增了一個屬性,AcceptChangesDuringUpdate,
這個設定影響了當DataAdapter.Update執行後是否自動執行
AcceptChanges, 其預設值是True,在單一Table Update時這個
預設值是完全正確且方便的,但當對象是parent/child Relation時
就有問題了,一般來說,我們會將Business Logic 寫在
DataAdapter.RowUpdating/RowUpdated中,在
parent/child Relation情況下, child可能於處理Business Logic時
需要讀取parent中的值,但此時parent的AcceptChanges
可能已被呼叫(因為是先Update Parent在Update Child),
造成Child無法取得Parent 的值,而產生Business Logic Error,
這或許是當初設計這個特性時未想到的情況吧.
Tuesday, September 20, 2005
Friday, September 16, 2005
Windows Workflow Foundation
PDC'05 上揭露了未來將出現在Longhorn 上的WWF,
從開發者角度來看,WWF 遵循了SOA及COA
(Component-Orient-Architecture),同時提供了一個
WorkFlow UI 供使用者使用,由使用者角度來看,WWF開啟了
另一種設計模式,使用者可以使用開發者所提供的Compoent,
依照自己的需求來架構應用程式,例如一個訂單動作,開發者將
儲存訂單,驗證訂單,排定出貨等細節動作全寫成Component,
設計者則使用WorkFlow Designer來整合訂單處理流程,他可
以選擇略過排定出貨的流程,或是改變驗證訂單的Component,
連一行程式都不用寫,全靠拖拉完成.
就個人來看,WWF 適合兩種人,一種是架構師,一種是分析師,
架構師利用WWF 來定義流程的Components,交給設計師撰寫,
分析師利用WWF來驗證並調整流程的動向.
Thursday, September 15, 2005
Linq
PDC 05 上揭露了C# 3.0 及Linq Project,什麼是Linq 呢? 簡單的說,Linq 是一個語言層級
的查詢語法Library,她可以讓我們以類SQL 語法的方式來查詢語言中的變數,例如陣列,
Collections. 以實例來說:
static void ObjectQuery()
{
var people = new List()
{
new Person { Age=12, Name="Bob" },
new Person { Age=18, Name="Cindy" },
new Person { Age=13 }
};
var teenagers = from p in people where p.Age > 12 && p.Age < 20 select p;
Console.WriteLine("Result:");
foreach(var val in teenagers)
{
Console.WriteLine("> Name = {0}, Age = {1}", val.Name, val.Age);
}
Console.ReadLine();}
class Person
{
public int Age;
public string Name;
}
Person是一個類別,ObjectQuery 函式中以Generic List建立了一個Person的Collection,
此處的var 型別是C# 3.0新增的型別, 從語言面來看,這個型別可以被指定為任何型別,
就像是Variant一樣,從Complier面來看,它是一個Lazy-determine型別,由Complier於編譯
期間來決定真正的型別,接下來的奇特語法就是Linq.
var teenagers = from p in people where p.Age > 12 && p.Age < 20 select p;
是不是覺得很像SQL呢? 這段程式碼的意思是,由people中選出Age大於12小於20的元素,
除了這種簡單的查詢之外,Linq 也支援Join,Distinct等語法.
基本上Linq只是一組Library,C# 3.0及VB.NET 9.0的Complier利用了這個Library來實現
上面的新語法,所有的特殊語法都會被編譯器編成使用Linq Library的程式.
Linq 讓程式語言又進化了.
的查詢語法Library,她可以讓我們以類SQL 語法的方式來查詢語言中的變數,例如陣列,
Collections. 以實例來說:
static void ObjectQuery()
{
var people = new List
{
new Person { Age=12, Name="Bob" },
new Person { Age=18, Name="Cindy" },
new Person { Age=13 }
};
var teenagers = from p in people where p.Age > 12 && p.Age < 20 select p;
Console.WriteLine("Result:");
foreach(var val in teenagers)
{
Console.WriteLine("> Name = {0}, Age = {1}", val.Name, val.Age);
}
Console.ReadLine();}
class Person
{
public int Age;
public string Name;
}
Person是一個類別,ObjectQuery 函式中以Generic List建立了一個Person的Collection,
此處的var 型別是C# 3.0新增的型別, 從語言面來看,這個型別可以被指定為任何型別,
就像是Variant一樣,從Complier面來看,它是一個Lazy-determine型別,由Complier於編譯
期間來決定真正的型別,接下來的奇特語法就是Linq.
var teenagers = from p in people where p.Age > 12 && p.Age < 20 select p;
是不是覺得很像SQL呢? 這段程式碼的意思是,由people中選出Age大於12小於20的元素,
除了這種簡單的查詢之外,Linq 也支援Join,Distinct等語法.
基本上Linq只是一組Library,C# 3.0及VB.NET 9.0的Complier利用了這個Library來實現
上面的新語法,所有的特殊語法都會被編譯器編成使用Linq Library的程式.
Linq 讓程式語言又進化了.
Tuesday, September 13, 2005
期待以久的Binding.ReadValue
以往在Windows Form中,假如我們在ColumnChanged,ColumnChanging更改某欄
位的值後,Binding Control是不會跟著更新的,而是要等到EndEdit才會更新,在.NET 2.0
中,Binding提供了ReadValue方法,可以強制Binding Control重新取值.
以下的範例展示如何使用ReadValue.
protected virtual void UpdateControlValue(CurrencyManager currencyMangaer)
{
foreach (Binding bind in ((ICurrencyManagerProvider)
_bindingSource).CurrencyManager.Bindings)
bind.ReadValue();
}
public void UpdateControlValue()
{
UpdateControlValue(((ICurrencyManagerProvider)
_bindingSource).CurrencyManager);
}
位的值後,Binding Control是不會跟著更新的,而是要等到EndEdit才會更新,在.NET 2.0
中,Binding提供了ReadValue方法,可以強制Binding Control重新取值.
以下的範例展示如何使用ReadValue.
protected virtual void UpdateControlValue(CurrencyManager currencyMangaer)
{
foreach (Binding bind in ((ICurrencyManagerProvider)
_bindingSource).CurrencyManager.Bindings)
bind.ReadValue();
}
public void UpdateControlValue()
{
UpdateControlValue(((ICurrencyManagerProvider)
_bindingSource).CurrencyManager);
}
被封印的Windows Form Inheritence.
對於一個寫了多年Delphi的人來說,不能應用Form Inheritence,
簡直跟沒法寫程式一樣難過,.NET 並非不支援Form Inheritence
,但是DataGridView只允許ReadOnly繼承這點就把Form Inheritence
的實用性從100 down 到10,雖然課堂上我寫了個新的DataGridView來
解決這個問題,但我仍然對ReadOnly Inheritence困惑.....封印的原因大
概是Code Parsing 困難,但....真的有這麼困難嗎?
簡直跟沒法寫程式一樣難過,.NET 並非不支援Form Inheritence
,但是DataGridView只允許ReadOnly繼承這點就把Form Inheritence
的實用性從100 down 到10,雖然課堂上我寫了個新的DataGridView來
解決這個問題,但我仍然對ReadOnly Inheritence困惑.....封印的原因大
概是Code Parsing 困難,但....真的有這麼困難嗎?
殘破的系統 -- CTP 之罪
在連續幾個月的VS 2005 CTP裝卸之後,我的系統終於亂到
了無法安裝VS 2005 RC了,在多方嘗試下,我找到了一些小技巧
來移除先前所安裝的CTP,通常VS 2005本身的安裝都不會有太
大的問題,問題在於SQL Server Express及SQL Server 2005 CTP,
當你遭遇到SQL Server告知你因系統中含有不相容的.NET Framework,
SQL Server CTP時,你要做的第一件事是到新增移除程式中查看是否有
前版CTP存在,有的話將它移除,之後若仍然無法安裝,那麼請至
http://www.huydao.net/setup/msizap.zip下載此程式,接著到
C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\Log目錄中
查看Log,其中會告訴你因為那些CTP存在,所以無法安裝,將那些機碼記下,
一一使用msizap來移除,如:
msizap -T {機碼}
結束後重新開機,你應該能安裝SQL Server CTP了.
當然,這還是有風險的....Good Luck.
了無法安裝VS 2005 RC了,在多方嘗試下,我找到了一些小技巧
來移除先前所安裝的CTP,通常VS 2005本身的安裝都不會有太
大的問題,問題在於SQL Server Express及SQL Server 2005 CTP,
當你遭遇到SQL Server告知你因系統中含有不相容的.NET Framework,
SQL Server CTP時,你要做的第一件事是到新增移除程式中查看是否有
前版CTP存在,有的話將它移除,之後若仍然無法安裝,那麼請至
http://www.huydao.net/setup/msizap.zip下載此程式,接著到
C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\Log目錄中
查看Log,其中會告訴你因為那些CTP存在,所以無法安裝,將那些機碼記下,
一一使用msizap來移除,如:
msizap -T {機碼}
結束後重新開機,你應該能安裝SQL Server CTP了.
當然,這還是有風險的....Good Luck.
Friday, September 09, 2005
From Delphi to .NET
最近幫某軟體公司所規劃的教育訓練課程已接近結束,
這套課程以Windows Form 為主,教導學員們如何使用
Windows Form來開發應用程式,由於原學員多是使用
Delphi 開發MIS系統,習慣了DELPHI那種快速與方便
的開發流程,在引導他們至.NET 的過程中,學員們常提
出DELPHI 中曾使用的技巧做為問題,詢問我在.NET中
如何做到,例如TField.GetText/SetText,計算欄位,Lookup
等等. 不可否認,這些東西在目前的.NET 中並未提供,即使
有提供,也不完整或是有Bug,為此我特別做了幾個Compoennt,
展示如何解決這些問題,經過這些課程後,我更確認.NET Windows
Form 可以像Delphi 般快速的開發應用程式,也確認了當初Delphi
的深謀遠慮. Delphi敗在品質與策略,資本,而不是技術.
這套課程以Windows Form 為主,教導學員們如何使用
Windows Form來開發應用程式,由於原學員多是使用
Delphi 開發MIS系統,習慣了DELPHI那種快速與方便
的開發流程,在引導他們至.NET 的過程中,學員們常提
出DELPHI 中曾使用的技巧做為問題,詢問我在.NET中
如何做到,例如TField.GetText/SetText,計算欄位,Lookup
等等. 不可否認,這些東西在目前的.NET 中並未提供,即使
有提供,也不完整或是有Bug,為此我特別做了幾個Compoennt,
展示如何解決這些問題,經過這些課程後,我更確認.NET Windows
Form 可以像Delphi 般快速的開發應用程式,也確認了當初Delphi
的深謀遠慮. Delphi敗在品質與策略,資本,而不是技術.
Thursday, September 08, 2005
近況
9/14將結束為時長達三年的技術顧問工作,
期間寫了為數不少的雜誌專刊及一本書,
技術顧問的工作不算輕鬆,動手去做,動口解決
問題,比起工程師,顧問工作更不允許犯錯,一個
錯誤會使成員走不少冤枉路,雖然如此!我還是
蠻Enjoy 這樣的工作型態,今年剩下的幾個月,
我不打算再接顧問工作,主因是近期幫一家公
司所規畫的Windows Form課程講完後的感覺
還不錯,客戶的反應讓我打算持續做.NET 教育訓練,
未來除了Windows Form外還會規畫ASP.NET 課程,
並籌劃一本.NET新書.
期間寫了為數不少的雜誌專刊及一本書,
技術顧問的工作不算輕鬆,動手去做,動口解決
問題,比起工程師,顧問工作更不允許犯錯,一個
錯誤會使成員走不少冤枉路,雖然如此!我還是
蠻Enjoy 這樣的工作型態,今年剩下的幾個月,
我不打算再接顧問工作,主因是近期幫一家公
司所規畫的Windows Form課程講完後的感覺
還不錯,客戶的反應讓我打算持續做.NET 教育訓練,
未來除了Windows Form外還會規畫ASP.NET 課程,
並籌劃一本.NET新書.
My Book
本書主軸環繞著元件設計技巧,由淺入深探討如何撰寫各式ASP.NET元件,與一般元件技術書籍不同,於本書中您常會發現立於元件使用者角度思考的痕跡,讓使用者舒適的使用元件,是一個元件設計師的義務。書中同時深入解析ASP.NET的運行模式,領您走入重幕後的秘境,知其然且知其所以然。除了提供幾近商業化元件的範例外,書中第六章為您拉開IDE的七彩幻幕,探討最深層的IDE運作模式,讓IDE成為您我元件活躍的舞台。是的,這不是一本為初學者所撰寫的書籍,但也不是一本只有高階設計師才能看的書籍,您可以於導讀一節中找到閱讀此書所需的基本功,基本上我將此書讀者層定位於”看得懂C#,玩過ASP.NET”。*深入解析ASP.NET運行模式*由淺入深的元件範例*IDE運作模式解密*Mobile Controls設計技巧
Subscribe to:
Posts (Atom)