zoukankan      html  css  js  c++  java
  • SubSonic应用_Collection

    SubSonic应用_Collection

    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分页


  • 相关阅读:
    2019-3-24
    模板
    试试Markdown编辑器
    Codeforces Round #529 (Div. 3) D. Circular Dance
    Codeforces Round #529 (Div. 3) C. Powers Of Two(数学????)
    poj 2566"Bound Found"(尺取法)
    poj 3273"Monthly Expense"(二分搜索+最小化最大值)
    二分搜索
    Codeforces Round #518 (Div. 2) B LCM
    2018.12.21 浪在ACM 集训队第十次测试赛
  • 原文地址:https://www.cnblogs.com/xiaoxxy/p/1915935.html
Copyright © 2011-2022 走看看