• 搭建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
     
  • 相关阅读:
    kubernetes概述
    pygame--图形模块
    iPhone 上你可能还不知道的小技巧
    使用 JdbcTemplate 查询数据时报错:列名无效(已解决)
    【分享】怎样做架构师?
    关于 oh-my-zsh 插件的使用(以 Sublime Text 为例)
    VI/VIM 无法使用系统剪贴板(clipboard)?(Ubuntu&Mac OS X已解决)
    Ubuntu 下 Sublime 无法输入中文?(已解决)
    VIM 的帮助文档在哪里?看这里。
    推荐一款好用的文件/文件夹对比工具 —— Beyond Compare
  • 原文地址:https://www.cnblogs.com/yangwujun/p/3118554.html
Copyright © 2020-2023  润新知