搭建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();
- query
-
subsonic的方法中query的功能最全面(http://subsonicproject.com/querying/using-the-original-query-tool/),
-
不仅能够实现各种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关键词:
IsEqualTo:where条件中的“等于”
如:Where(CyReceiver.FNoticeIDColumn).IsEqualTo(noticeId)
IsNotEqualTo: where条件中的“不等于”
EqualTo:set语句中的“等于” 如: Set(CyReceiver.FStateColumn).EqualTo(1)
IsGreaterThan :where中的“大于”
IsGreaterThanOrEqualTo:大于等于
IsLessThan:where中的“小于”
IsLessThan OrEqualTo:小于等于
IsBetweenAnd:区间
如:Where(CyNotice.FBeginDateTimeColumn).IsBetweenAnd(beginDate, endDate)
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:左外连接 (当然还有RightOuterJoin、Joins、LeftInnerJoin等等)
如:From(CyNotice.Schema)
.LeftOuterJoin(CyUser.FidColumn, CyNotice.FUserIDColumn)
Paged:分页
转自http://www.cnblogs.com/xiaoxxy/archive/2010/12/24/1915935.html