close

下列是幾個查用的範例

1.單表查詢,使用條件、排序的方式進行查詢

//基本型
Query MyQuery = Employee.CreateQuery();
MyQuery.AddWhere(Employee.Columns.EmployeeID, "");
MyQuery.AddWhere(Employee.Columns.Address, Comparison.Like, "%");
MyQuery.ORDER_BY(Employee.Columns.EmployeeID + "desc");

EmployeeCollection MyCollection = new EmployeeCollection();
IDataReader rdr = MyQuery.ExecuteReader();
MyCollection.LoadAndCloseReader(rdr);

return MyCollection;

 

2.透過SQL語法查詢,參數的部分建議透過Parameter,避免發生SQL Injection

//SQL語法
string sql = "select * from Employee where EmployeeID = @EmployeeID and Address Like @Address order by EmployeeID desc;";
QueryCommand cmd = new QueryCommand(sql);

cmd.AddParameter("@EmployeeID", "");
cmd.AddParameter("@Address", "%");

EmployeeCollection MyCollection = new EmployeeCollection();
IDataReader rdr = DataService.GetReader(cmd);

MyCollection.LoadAndCloseReader(rdr);

return MyCollection;

3.類似LINQ型的查詢(2.1版本以後支援)

SqlQuery MyQuery =
 new Select().From<Employee>()
 .Where("EmployeeID").IsEqualTo("")
 .And("Address").Like("%")
 .OrderDesc(new string[] { "EmployeeID" });

EmployeeCollection MyCollection = new EmployeeCollection();
IDataReader rdr = MyQuery.ExecuteReader();
MyCollection.LoadAndCloseReader(rdr);

return MyCollection;

此類型更詳細的範例可參考
http://subsonicproject.com/docs/Simple_Query_Tool


上述3種方法的結果是相同的,但有其他衍生的缺點
1.只能對單一表查詢
2.欄位必須全部取出處理

雖然說方法3可以選擇欄位和Join其他資料表,
但最終在轉換IList的時候也會因為Class的欄位與查詢結果的欄位無法對應,造成轉換失敗。

面對此問題採用了兩種方法可以處理
1.利用.NET關鍵字partial擴充SubSonic產生的Class,查詢後轉DataSet(DataTable),並一個一個塞入。
2.使用View處理,SubSonic也會對View產生Class使用,只是View的管理上必須更小心謹慎

目前我們公司是採用2的方式去克服這個問題,
只是View已經建到多的有點誇張了~沒管理好,不知道哪些功能使用到這些View。
但我這邊還是覺得透過第二種方式去掩飾這個問題會好很多~

沒意外的話,下回就是Insert、Update、Delete還有store procedure

arrow
arrow
    全站熱搜

    gogo1119 發表在 痞客邦 留言(0) 人氣()