C语言辅导:在C#中建立复杂的、灵活的SQL查询/命令
来源:优易学  2011-2-19 15:04:20   【优易学:中国教育考试门户网】   资料下载   IT书店

 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.*”)。

上一页  [1] [2] [3] 下一页

责任编辑:虫虫

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训