搭建SubSonic应用环境

SubSonic是一个ORM框架,或者说是一个代码生成器,它的工作流程和一般的ORM工具不同,所有的工作全是自动完成,生成完整的数据访问层类库,然后在工程中引用即可使用。整个过程很简单,下面就生成数据访问层类库的过程记录如下:
    1、建立一个c#类库工程
    2、删除默认生成的class1.cs文件
    3、工程添加三个引用,SubSonic.dll(前提是先安装了subsonic才会有这个)、 

System.Web和System.Configuration命名空间
    4、在工程下建立一个文件夹,Generated

5、在工程中添加一个新文本文件,命名为:app.config,内容如下:

 

<?xml version="1.0"?>

<configuration>

 

  <!-- 第一部分是照着写就可以了,没有什么好说的-->

  <configSections>

    <section name="SubSonicService" type="SubSonic.SubSonicSection,SubSonic" requirePermission="false"/>

  </configSections>

 

  <!-- 第二部分是定义一个或者多个连接数据库的字符串,其中要注意的是这部分的name的值是第三部分connectionStringName属性的值-->

  <connectionStrings>

    <!-- 连接数据库的字符串 -->

    <add name="Nowthwin"

         connectionString="DataSource=.;Initial Catalog=BuySaleStorage;Persist Security Info=True;User ID=sa;"/>

  </connectionStrings>

 

  <!-- 第三部分是将连接字符串和数据库驱动匹配起来成为一个连接。name是连接的名字,generatedNamespace的值是生成对象的命名空间-->

  <SubSonicService defaultProvider="Nowthwin">

    <providers>

      <clear/>

      <add name="Nowthwin"

           type="SubSonic.SqlDataProvider,SubSonic"

           connectionStringName="Nowthwin"

           generatedNamespace="Nowthwin"/>

    </providers>

  </SubSonicService>

 

</configuration>
    4、在vs中工具菜单中选择 “工具” -> “外部工具” 命令,定义一个外部工具菜单项,

         标题为SubSonic DAL(也可以自己命名),

         命令为SubSonic文件夹的中命令行工具sonic.exe的路径,

         参数为:generate /out Generated(生成后的路径为当前路径下的Generated文件夹。),

         初始目录为:$(ProjectDir),

         并勾选“使用命令窗口”和“提示输入参数”两个选项,点确定。

    5、此时vs的工具菜单多了一项“SubSonic DAL命令,单击,然后确定。
    6、执行完毕,在Generated文件夹中会生成你设定的数据库的类库文件,包括表、视图、存储过程的c#包装。如果出现错误,一般是因为数据库连接串有问题,请仔细检查。
    7、把Generated文件夹下的所有文件包含到工程中,然后编译,生成类库。至此,全部工作完成,可以在项目中使用ORM操作您的数据库了,完全强类型化的数据库操作方法。
    8、在项目中使用这个类库的时候,需要在web.config中把上面的app.config中的设置,复制到对应的小节中。
    9、数据库修改后,只要重新生成一次类库即可,这可能就是所谓的零数据访问层代码实现吧,总之是非常方便。

 

以Northwind数据库为例

 

/联合查询

DataTabledt = new Select(

                       Product.Columns.ProductName,Category.Columns.CategoryName,

                       Supplier.Columns.CompanyName)

                      .From(Product.Schema).InnerJoin(Category.Schema)

                      .InnerJoin(Supplier.Schema)

                      .ExecuteDataSet().Tables[0];

_____________________________________________________________________________

//子查询

DataSetdt = new Select().From(Product.Schema)

    .Where("productid").In(1, 2, 3,4, 5)ExeCuteDataSet();

 

DataSetdt = new Select().From(Product.Schema).Where(Product.Columns.CategoryID)

            .In(

              newSelect("categoryID").From(Category.Schema)

             .Where(Category.Columns.CategoryName).IsEqualTo("Produce"))

            .ExecuteDataSet() ;

______________________________________________________________________________________________

//聚合函数使用

 

doubleresult = new

   Select(Aggregate.Sum("UnitPrice*Quantity","ProductSales"))

    .From(OrderDetail.Schema)

    .ExecuteScalar<double>();

____________________________

例(2) :若生成的命名空间是test,生成的数据库实体名为:blogstudent

在项目文件中引入实体的命名空间using test;这样,便可以进行各种操作了

基本操作如下:

  • insert
    • blogstudent.Insert

(数据库各字段值);

  • delete

单个数据删除: blogstudent.Delete("id",2);

批量数据删除:

Query q = blogstudent.Query();
q.WHERE("name=xuxiuyun");
q.QueryType = QueryType.Delete;q.Execute();//也可:
Query q = new Query("blog_students");
q.BuildDeleteCommand();q.WHERE("id", 9).WHERE("name","xuxiuyun");
q.Execute();
  • update

单个数据更新:

blogstudent=new blogstudent("id");
blogstudent.name="xxy";
blogstudent.save()

批量数据更新:

Query q = BlogStudent.Query();
q.WHERE("name=ssssss").AddUpdateSetting("name", "xuxiuyun");
q.QueryType = QueryType.Update;q.Execute();

不仅能够实现各种select语句的交互式参数输入,而且能够实现数据的分页功能:

Query q = BlogStudent.Query();
q.WHERE("name=sssss");
q.QueryType = QueryType.Select;
q.PageSize = 2;
q.PageIndex = 3;//其中pageIndex从1开始.
______________________________________________________________________________________________

查询返回对象:

 return query.ExecuteDataSet().Tables[0];含义是将查询的记录集返回为DataTable对象。当然还可以返回其他的对象:


以下是常用的查询返回对象:
Ø  ExecuteReader():返回IDataReader对象
Ø  ExecuteDataSet():返回DataSet对象
Ø  ExecuteScalar():返回Object对象,返回查询记录集中的第一行第一列的值
Ø  ExecuteScalar<T>():返回范型对象如:ExecuteScalar<string>()
Ø  Execute():返回执行后,数据更新条数
Ø  ExecuteSingle<表实体>():返回表实体对象如:ExecuteSingle<Users>()
Ø  ExecuteTypedList<表实体>():返回范型表实体数据集

新增、修改:


1. Subsonic中的新增和修改可以共享一个方法(InsertOrUpdate):
user.InsertOrUpdate(); //其中user是传入的用户实体
return user.Fid;
当然它们也有自己独立的方法:
2.  新增:
notice.Save();//其中notice是传入的公告实体
return NoticeId = notice.Fid;
3. 修改
int i = new Update(CyReceiver.Schema)
.Set(CyReceiver.FStateColumn).EqualTo(1)
.Where(CyReceiver.FNoticeIDColumn).IsEqualTo(noticeId)
.And(CyReceiver.FUserIDColumn).IsEqualTo(userId).Execute();------------------------------------------------------------------------------------------------------------------------

SQL关键词:


IsEqualTowhere条件中的“等于
 如:Where(CyReceiver.FNoticeIDColumn).IsEqualTo(noticeId)
IsNotEqualTo: where条件中的“不等于
EqualToset语句中的“等于  如: Set(CyReceiver.FStateColumn).EqualTo(1)
IsGreaterThan :where中的“大于”
IsGreaterThanOrEqualTo:大于等于
IsLessThanwhere中的“小于”
IsLessThan OrEqualTo:小于等于
IsBetweenAnd区间
如:Where(CyNotice.FBeginDateTimeColumn).IsBetweenAnd(beginDateendDate)
OrderAsc按某字段升序排序  如:OrderAsc(CyUser.Columns.FUsersSort)
OrderDesc: 按某字段降序序排序
And:逻辑中的“且”
Or: 逻辑中的“或”
Like:模糊查询关键词
如:And(CyNotice.FTitleColumn).Like("%" + model.Title + "%")
更常用的是:title=string.Format("%{0}%", model.Title);
             And(CyNotice.FTitleColumn).Like(title);
LeftOuterJoin:左外连接 (当然还有RightOuterJoinJoinsLeftInnerJoin等等)
如:From(CyNotice.Schema)
.LeftOuterJoin(CyUser.FidColumnCyNotice.FUserIDColumn)
Paged分页
 
转自http://www.cnblogs.com/xiaoxxy/archive/2010/12/24/1915935.html
 
posted @ 2013-06-05 11:10  哪啊哪啊神去村  阅读(345)  评论(0编辑  收藏  举报