2009年5月12日 星期二

極意之道—次世代.NET Framework 3.5資料庫開發聖典 ASP.NET篇

極意之道次世代 .NET Framework 3.5資料庫開發聖典ASP.NET篇

Bug?
P.2-10~P.2-10
Connection物件應該是BeginTransaction()而非StartTransaction()...這是Delphi過來人的錯嗎?
P.2-51
程式2-22中的dv2應該是dv1吧?



O/R Mapping(Object Relation Mapping)

一般會使用
using (conn)
{
.....
}

SqlConnection >> SqlCommand >> SqlReader

Delphi程式中傳參數的方式是用冒號:
'select * from ooxx where Cust2 = :Cust2'
對照C#程式中傳參數的方式是用小老鼠@
"select * from ooxx where Cust2 = @Cust2"

Parameter sample:
SqlParameter p1 = cmdReader.CreateParameter();
p1.SqlDbType = SqlDbType.VarChar;
p1.Value = "XXX";
p1.Direction = ParameterDirection.Input;
p1.ParameterName = "@Cust2";

Transaction
常用的有三種: CommittableTransaction, TransactionScrope, DependentTransaction
其中CommittableTransaction是為了昇級舊程式用的,新程式應直接使用TransactionScrope或DependentTransaction
TransactionScrope若未呼叫Complete(),則會自動還原資料,程設人員不必呼叫RollBack
若有特殊需求要手動控制commit和rollback,則可使用CommittableTransaction
DependentTransaction用在多Thread用同一個Transaction時

ADO.Net支援二種存取資料庫的模示:
連線模示: DataReader
離線模示: DataTable, DataAdapter

Type-Accessor不會為你轉型,例如你用GetString去取一個integer型態的欄位,會引發型態錯誤的例外
Type-Accessor存取有null值的欄位時,會引發例外。因此在使用前最好透過IsDbNull來判斷該欄位值是否為null

使用StoreProcedure的方式
ASqlCommand.CommandType = CommandType.StoredProcedure;
ASqlCommand.CommandText = "Your Store Procedure Name";

Multi Result Set可以使用NextResult切換至下一個結果集

P.2-20
MARS(Multiple Active Result Sets)
SQL2000不支援,SQL2005開始有支援
MARS並非同時執行多個DataReader,而是在執行其中之一時將其它的暫停
以SQL2005為例,連線字串中加入 MultipleActiveResultSets=true

P.2-21
非同步模示
以SQL2005為例,連線字串中加入Asynchronous Processing=true
使用BeginExecuteReader會傳回一個IAsyncResult型別的物件
再透過判斷其IsCompleted屬性是否為true來得知是否該指令已執行完畢
再呼叫EndExecuteReader取得DataReader物件

P.2-23
離線模示: DataTable, DataAdapter
離線模示的類資料庫儲存體與後端資料庫連線的時機只有二個,其它時候皆處於離線狀態
一、由資料庫取出資料倒入儲存體時
二、依儲存體中的異動記錄將資料異動回資料庫時

DataSet
DataTableCollection
DataTable
DataColumnCollection
DataRowCollection
ConstraintCollection
DataRelationCollection

建立DataTable sample:
>>>>>copy 2-11 code

P.2-29
ItemArray比逐欄設定來的有效率, 適合批次新增資料

P.2-29
row assign value的做法
>>>>>copy 2-13 code

P.2-29
資料的搜尋
DataSet可使用Select()及Find()
select: 傳入查詢式
find: 傳入主鍵要搜尋的值,效能優於select,但前提是該DataTable要有主鍵

P.2-39
Typed DataSet與Un-Typed DataSet

P.2-41
DatAdapter有4個Command屬性
SelectCommand
InsertCommand
DeleteCommand
UpdateCommand

P.2-43
當呼叫DataTable物件的NewRow函式時,回傳的DataRow物件之RowStatus屬性值為Detached
而呼叫dataTable物件的Rows中的Add函式,並將此DataRow物件傳入後,此DataRow物件的RowStatus屬性會轉變為Added

P.2-45
DataRowVersion
Current
Default
Original
Proposed

偵測DataRow物件中是否有指定DataRowVersion的值,可用DataRow物件的HasVersion函式來得知

P.2-46
更新動作前會觸發RowUpdating,更新後會獨發RowUpdated
RowUpdating: 通常在這裡會處理填入預設值、處理BusinessRule

P.2-48
DataTable物件本身不提排序的功能,而是交由DataView物件來處理排序
一個DataTable物件可以有多個DataView物件,每個DataView物件可以擁有自已的排序
當DataTable物件異動後,其DataView物件也會即時反應
DataView的物件並非是將DataTable中的資料複製一份,而是將其DataRow物件的指標複製到內部的陣列中
如果想搜尋主鍵以外的欄位,DataView物件所提供的find函式是最具效率的

P.2-49
DataView搜尋資料的方式:Find函式、FindRows函式
DataView設定Sort和Filter的方式
Dv1.Sort = "Cust2 DESC";
Dv2.RowFilter = "Cust2 like 'A%'";
DataView單一欄位find
dv1.Sort ="Cust3 DESC";
int index = dv1.Find("ASE");
DataView多欄位find
dv1.Sort ="Cust3,CustName DESC";
int index = dv1.Find(new object[] {"ATI","AMD Co."});

P.2-52
TableAdapter