SelectQueryBuilder方式的代碼
同樣的查詢能夠使用SelectQueryBuilder類建立。
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Customers");
query.SelectAllColumns();
query.TopRecords = maxRecords;
if (companyNameTextBox.Text.Length > 0)
query.AddWhere("CompanyName", Comparison.Like,companyNameTextBox.Text + "%");
if (cityTextBox.Text.Length > 0)
query.AddWhere("City", Comparison.Like,
cityTextBox.Text + "%");
if (countryComboBox.SelectedItem != null)
query.AddWhere("Country", Comparison.Equals,
countryComboBox.SelectedItem);
string statement = query.BuildQuery();
// or, have a DbCommand object built
// for even more safety against SQL Injection attacks:
query.SetDbProviderFactory(
DbProviderFactorIEs.GetFactory(
"System.Data.SqlClIEnt"));
DbCommand command = query.BuildCommand();
你能看到,這種方式比直接使用連接字符串更直觀。考慮到第一個例子SQL注入的危險,通過SelectQueryBuilder建立的SELECT查詢是非常安全的,並不用擔心使用的TextBoxs中的內容。事實上它也非常簡單!
使用SQL函數
如果你想在你的查詢中使用SQL函數,你能使用SqlLiteral類來打包函數的調用。說明這個類能作什麼的最好方式就是給你顯示一小段代碼例子:
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
query.AddWhere("OrderDate", Comparison.LessOrEquals,new SqlLiteral("getDate()"));
如果我們沒有打包getDate()函數調用到SqlLiteral類中,建立的查詢就會產生WHERE子句:OrderDate<=’getDate()’。當然,我們希望在語句中的這個函數沒有被單引號包圍。這時SqlLiteral就可以派上用場了:它直接拷貝字符串到輸出,並沒有把它格式化成字符串。現在的輸出WHERE子句應當是OrderDate<=getDate()!
查詢中使用JOINs
要創建到其它表的JOINs,你能使用AddJoin方法。下面的代碼顯示了如何創建一個從Ordres表到Customers表的INNER JOIN。
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
query.AddJoin(JoinType.InnerJoin,"Customers", "CustomerID",Comparison.Equals,"Orders", "CustomerID");
query.AddWhere("Customers.City",Comparison.Equals, "London");
這段代碼選擇所有居住在London的客戶的訂單。一旦調用了BuildQuery方法,就會產生下面的SQL語句:
SELECT Orders.*
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE (Customers.City = 'London')
注意到缺省的查詢只會建立所選擇的表的selects * 語句(這個例子中的Orders.*)。如果你也想選擇連接表的列的話,你必須得顯式地選擇它們。你能通用調用query.SelectColumns(“Orders.*”,”Customers.*”)。