SubSnoic 框架
SubSnoic 框架入门到提高
关于这个框架的介绍我就不说了,网上很多,我只教基本用法,基本逻辑语句写法
为了让学习者能顺利学习,我已将subsonic2.2上传到了csdn上了 ,下载地址: http://download.csdn.net/download/yangyanghaoran/4318138
为了防止恶意转载:本文地址 http://www.cnblogs.com/Fresh-Air/archive/2012/05/21/2511578.html
一:现在D盘建一个文件夹:SubsonicTest, 在该目录下放置你需要的文件 SubSonic2.2.ZIP 文件解压了,放在了这里
二:打开sqlserver2008,执行下面的脚本,创建我们需要的数据库
use master go -- 创建库 if exists( select * from sysdatabases where name= ' SubSonicTestDB ' ) drop database SubSonicTestDB create database SubSonicTestDB on primary ( name = ' SubSonicTestDB_data ' , filename = ' D:\SubsonicTest\SubSonicTestDB_data.mdf ' , filegrowth = 30 % , size = 5 )log on ( name = ' SubSonicTestDB_log ' , filename = ' D:\SubsonicTest\SubSonicTestDB_log.ldf ' , size = 2 , filegrowth = 10 % ) go -- 创建表Student use SubSonicTestDB go if exists( select * from sysobjects where name= ' Teacher ' ) drop table Teacher create table Teacher( TeacherID int identity( 1 , 1 ) primary key, TeacherName varchar( 20 ), TeacherPhone varchar( 13 ) constraint VK_TeacherPhone check(TeacherPhone like ' ____-________ ' or TeacherPhone like ' ___-________ ' or TeacherPhone like ' [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ' ), ) if exists( select * from sysobjects where name= ' Student ' ) drop table Student create table Student( StudentID int identity( 1 , 1 ) primary key, StudentName varchar( 20 ), StudentHobby varchar( 20 ), TeacherID int constraint FK_TeacherID foreign key(TeacherID) REFERENCES Teacher(TeacherID) ) go insert into Teacher(TeacherName,TeacherPhone) select ' 张老师 ' , ' 15252025205 ' union all select ' 刘老师 ' , ' 15252025202 ' union all select ' 田老师 ' , ' 15252025235 ' union all select ' 卢老师 ' , ' 15252025234 ' union all select ' 王老师 ' , ' 15252025206 ' go insert into Student(StudentName,StudentHobby,TeacherID) select ' 小慈 ' , ' 打羽毛球 ' , 1 union all select ' 小明 ' , ' 下围棋,读英语 ' , 1 union all select ' 小方 ' , ' 看漫画 ' , 2 union all select ' 小龙 ' , ' 武术 ' , 3 union all select ' 小虎 ' , ' 中国象棋 ' , 5 union all select ' 小城 ' , ' 听听音乐 ' , 1 union all select ' 小美 ' , ' 说英语,日语 ' , 4 union all select ' 小聪 ' , ' 看漫画,踢毽子 ' , 2 union all select ' 小红 ' , ' 看爱情电影 ' , 3 union all select ' 小仲 ' , ' 中国象棋 ' , 5 union all select ' 小冬 ' , ' 学习编程 ' , 3 go
三、打开VS2010
1.新建解决方案 名称:SubSonicTest,放在D盘的那个文件夹下
2.在该解决方案下新建类库:SubSonicDAL
① 删除默认生成的 class1.cs 文件
②引用SubSonic.dll(前提是先安装了subsonic才会有这个)
System.Web和System.Configuration命名空间
③添加配置文件 App.config
下面是我app.config文件的内容,这是搜吧subsonic的基本配置
<?xml version= " 1.0 " encoding= " utf-8 " ?> <configuration> <!-- 此处不要随便修改 --> <configSections> <section name= " SubSonicService " type= " SubSonic.SubSonicSection, SubSonic " requirePermission= " false " /> </configSections> <!-- 这里定义一个或者多个连接数据库的字符串,其中要注意的是这部分的name的值是下面connectionStringName属性的值--> <connectionStrings> <!-- 连接数据库的字符串 --> <add name= " StudentConn " connectionString = " Data Source=.;Initial Catalog=SubSonicTestDB;Integrated Security=True " /> </connectionStrings> <!-- 此处是将连接字符串和数据库驱动匹配起来成为一个连接,name是连接的名字,generatedNamespace的值是生成对象的命名空间--> <SubSonicService defaultProvider= " StudentConn " > <providers> <clear/> <add name= " StudentConn " type = " SubSonic.SqlDataProvider, SubSonic " connectionStringName = " StudentConn " generatedNamespace = " StudentMGR " /> </providers> </SubSonicService> </configuration>
3.配置工具
在vs中工具菜单中选择 “工具” -> “外部工具” 命令,定义一个外部工具菜单项,
点添加创建一个新的工具
标题为SubSonic Tools(也可以自己命名),
命令为SubSonic文件夹的中命令行工具sonic.exe的路径,
参数为:generate /out Generated(生成后的路径为当前路径下的Generated文件夹。),
初始目录为:$(ProjectDir),
并勾选“使用命令窗口”和“提示输入参数”两个选项,点确定。
然后点确定。接下来就是见证奇迹的时刻了
此时 vs 的工具菜单多了一项 “SubSonic DAL 命令,单击,然后确定。
执行完毕,在 Generated 文件夹中会生成你设定的数据库的类库文件,包括表、视图、存储过程的 c# 包装。如果出现错误,一般是因为数据库连接串有问题,请仔细检查
然后你的解决方案应该会这样:
包含到项目中,然后展开如图, 然后编译,生成类库
OK,所有工作基本完成了,接下来该学习怎么用这些生成好的文件了
关于更删改查,分页在下一篇博客写,如有疑问请留言
上篇说到了 subsonic 的配置与然后根据数据库生成实体操作类
下面我们继续学习,他的逻辑处理语句
为了方便演示,我就不建什么框架了,直接UI层用控制台了,还请见谅
右键上次的那个项目 ,添加 控制台应用程序:SubSonicUI
如图:
然后添加 SubSonic.dll 和 System.configuration.dll 类库的引用,还有StudentMGR类库的引用 完成后如下:
下面我们一起具体学习吧,本人也不过也是初学者哦!呵呵
一、单条件单表 查询
// 基本查询,查询出所有学生的信息 DataTable dt = new Select().From(Student.Schema).ExecuteDataSet().Tables[ 0 ]; foreach (DataRow item in dt.Rows) { Console.WriteLine(item[ 0 ]+ " \t " +item[ 1 ]+ " \t " +item[ 2 ]); }
或者
IDataReader dr = Student.FetchAll(); while (dr.Read()) { Console.WriteLine(dr[ " StudentId " ] + " \t " + dr[ " StudentName " ] + " \t " + dr[ " StudentHobby " ]); }
二、查出姓名叫小龙的爱好
Student st = new Select(Student.Columns.StudentHobby).From(Student.Schema).Where( " StudentName " ).IsEqualTo( " 小龙 " ).ExecuteSingle<Student> ();
或者
Student st = new Select( " StudentHobby " ).From(Student.Schema).Where( " StudentName " ).IsEqualTo( " 小龙 " ).ExecuteSingle<Student>();
或者
Student st = new Select( " StudentHobby " ).From<Student>().Where( " StudentName " ).IsEqualTo( " 小龙 " ).ExecuteSingle<Student>();
或者
Student st = new Select( " StudentHobby " ).From<Student>().Where(Student.StudentNameColumn).IsEqualTo( " 小龙 " ).ExecuteSingle<Student>();
或者
Student st = DB.Select( " StudentHobby " ).From<Student>().Where(Student.StudentNameColumn).IsEqualTo( " 小龙 " ).ExecuteSingle<Student>();
或者
Student st = new Student(); Query qu = new Query(Student.Schema); qu.WHERE( " StudentName==小龙 " ); qu.SelectList = Student.Columns.StudentHobby; IDataReader dr = Student.FetchByQuery(qu); while (dr.Read()) { st.StudentHobby = dr[ 0 ].ToString(); } Console.WriteLine("小龙的爱好是:"+st.StudentHobby);
或者
Student st = new Student(); Query qu = new Query(Tables.Student); //这行不一样 qu.WHERE( " StudentName==小龙 " ); qu.SelectList = Student.Columns.StudentHobby; IDataReader dr = Student.FetchByQuery(qu); while (dr.Read()) { st.StudentHobby = dr[ 0 ].ToString(); } Console.WriteLine("小龙的爱好是:"+st.StudentHobby);
或者
Student st = new Student(); Query qu = new Query("Student" ); //这行不一样 qu.WHERE( " StudentName==小龙 " ); qu.SelectList = Student.Columns.StudentHobby; IDataReader dr = Student.FetchByQuery(qu); while (dr.Read()) { st.StudentHobby = dr[ 0 ].ToString(); } Console.WriteLine("小龙的爱好是:"+st.StudentHobby);
或者 注意列名称的使用哦,都经过测试的哦
DataSet sts = new Query(Tables.Student).WHERE( " StudentName==小龙 " ).ExecuteDataSet(); foreach (DataRow item in sts.Tables[ 0 ].Rows) { Console.WriteLine( " 小龙的爱好是: " + item[ " StudentHobby " ]); Console.WriteLine( " 小龙的爱好是: " + item[ 2 ]); Console.WriteLine( " 小龙的爱好是: " + item[Student.Columns.StudentHobby]); Console.WriteLine( " 小龙的爱好是: " + item[Student.StudentHobbyColumn.ToString()]); }
三、查出爱好是中国象棋的人,按学生姓名排序降序显示
DataSet sts = new Query(Tables.Student).WHERE( " StudentHobby==中国象棋 " ).ORDER_BY( " StudentName desc " ).ExecuteDataSet(); foreach (DataRow item in sts.Tables[ 0 ].Rows) { Console.WriteLine(item[ " StudentId " ]+ " \t " +item[ " StudentName " ] + " \t " + item[ " StudentHobby " ]); }
按照学生id 升序显示
DataSet sts = new Query(Tables.Student).WHERE( " StudentHobby==中国象棋 " ).ORDER_BY( " StudentId asc " ).ExecuteDataSet(); foreach (DataRow item in sts.Tables[ 0 ].Rows) { Console.WriteLine(item[ " StudentId " ]+ " \t " +item[ " StudentName " ] + " \t " + item[ " StudentHobby " ]); }
where里面的条件也可以这样写
DataSet sts = new Query(Tables.Student).WHERE( " StudentHobby " , " 中国象棋 " ).ORDER_BY( " StudentId asc " ).ExecuteDataSet();
多条件多表 查询
1、查出张老师班喜欢英语的学生的信息
// 查出张老师班喜欢英语的学生的信息 IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn,Teacher.TeacherNameColumn).From<Student>().InnerJoin<Teacher>().Where( " StudentHobby " ).Like( " %英语% " ).And( " TeacherName " ).IsEqualTo( " 张老师 " ).ExecuteReader(); while (dr.Read()) { Console.WriteLine(dr[ " StudentId " ] + " \t " + dr[ " StudentName " ] + " \t " + dr[ " StudentHobby " ] + " \t " + dr[ " TeacherName " ]); }
注意,我这里有点不严谨,你发现了吗
你可用一下语句,可以查看一下后面select生成的sql语句
SqlQuery q = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema). InnerJoin <Teacher>().Where( " StudentHobby " ).Like( " %英语% " ).And( " TeacherName " ).IsEqualTo( " 张老师 " );
然后
Console.WriteLine(q.ToString());
输出下面一句话(我们熟悉的sql):
SELECT [dbo].[Student].[StudentID], [dbo].[Student].[StudentName], [dbo].[Student].[StudentHobby], [dbo].[Teacher].[TeacherName] FROM [dbo].[Student] INNER JOIN [dbo].[Teacher] ON [dbo].[Student].[TeacherID] = [dbo].[Teacher].[TeacherID] WHERE [dbo].[Student].[StudentHobby] LIKE @StudentHobby0 AND [dbo].[Teacher].[TeacherName] = @TeacherName1
我的建议多表查询这样写,还可以避免一下类似的错误,下面是我的员工,部门,职位,三张表的查询,由于不规范,会偶尔出这样的错误,如果有疑问,你就把你的subsonic语句用SqlQuery 类型的变量保存起来,然后输出,你看看输出来的sql语句是什么样的就知道了
下面我把我的员工部门职位 正确的三张表的查询 语句发一下吧,来体现多表查询 正好学习一下
SqlQuery q = new Select(Employee.Columns.Number, Role.Columns.Title, Department.Columns.Title).
From<Employee>().
InnerJoin(Department.IdColumn, Employee.DepartmentIdColumn).
InnerJoin(Role.IdColumn, Employee.RoleIdColumn);
生成的sql语句
我把他复制到sqlserver2008中查询的时候,执行,正是我想要的结果。备注:这样写,可以解决多表中要显示的列名 如果列名是一样,只显示某张表中的那列数据的问题,如例子:员工的姓名列名叫 Title,而部门的名称 列名 也叫 Title ,职位的列名 也叫 Title
注意: InnerJoin(f1,f2) , 其中f1的为关联的表,而 f2为主表(此例子中是Employee),如果报了此类错误,请调一下 关联的 InnerJoin中的两个参数的位置,反正我是这样解决的,也总结出来了,因为我也是“受害者”,呵呵
所以呢
上面的subsonic语句该怎么改?
IDataReader dr = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema). InnerJoin(Teacher.TeacherIDColumn, Student.TeacherIDColumn).Where( " StudentHobby " ).Like( " %英语% " ).And( " TeacherName " ).IsEqualTo( " 张老师 " ).ExecuteReader();
其中InnerJoin如果你看它的提示的话,还可以这样写:
IDataReader dr = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema). InnerJoin( " Teacher " , " TeacherID " , " Student " , " TeacherID " ).Where( " StudentHobby " ).Like( " %英语% " ).And( " TeacherName " ).IsEqualTo( " 张老师 " ).ExecuteReader();
两张表查询,应该不要这么规范吧,应该也就无所谓了,但我觉得还是规范的好,具体学习,还是看提示拓展的。
用InnerJoin方法关联,关联其他表的,这就是多表了然后你在前面再加上该表的某些列名就行了,好像没有sql语句好,我还是宁愿用sql语句写起来顺手,还可以左查询,右查询,左外查询,右外查询,全查询,交并且查询,子查询(不过,这个也包括子查询,竟然你选择用subsonic生成了代码,你就要听他的了,哎)等,不过subsonic也带
例如: LeftInnerJoin() , LeftInnerJoin<T>()
RightInnerJoin() , RightInnerJoin<T>()
LeftOuterJoin() , LeftOuterJoin<T>()
RightOuterJoin() , RightOuterJoin<T>()
OuterJoin(), OuterJoin<T>()
CrossJoin(), CrossJoin<T>() 等,怎么用应该不用我说了吧,不过你好像需要sql的基础
Like模糊查询,IsEqualTo精确查询,And增加一个查询条件
From<Student>() 等同于 From("Student") 等同于 From(Tables.Student) 等同于 From(Student.Schema) 哇靠!这么多种,列名的显示方法 也有很多
Select() 括弧里面放要显示的列名,呵呵,感觉你既要有sql的理解基础,还要 linq的理解基础,哎~ 其实linq的链式编程,那么网页上的 jquery的链式应该也懂咯,下次有机会再从基础到提高讲一下jquery吧
哦,提醒一下,那个where里面的条件,查询比较字符串,例如 WHERE("StudentHobby==中国象棋") ,用双等于号,比较数字用 但等于号 "=" ,可以用 ">" "<"等
再讲一点where后面的 . 后面的某些方法吧
① 找出编号小于5的学生信息 IsLessThan()
IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where( " StudentID " ).IsLessThan( 5 ).ExecuteReader(); while (dr.Read()) { Console.WriteLine(dr[ " StudentId " ] + " \t " + dr[ " StudentName " ] + " \t " + dr[ " StudentHobby " ]); }
② 找出编号小于等于5的学生信息 IsLessThanOrEqualTo()
IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where( " StudentID " ).IsLessThanOrEqualTo( 5 ).ExecuteReader();
同理 大于,大于等于的两个方法分别是 IsGreaterThan() , IsGreaterThanOrEqualTo()
③找出编号在5到10之间的,包括5和10,包括不包括应该知道怎么写了吧 (有点分页思想哦!)
我在这里写,只是为了体现某些细的知识点,随便看就知道了
第一种
IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where( " StudentID " ).IsGreaterThanOrEqualTo( 5 ).And( " StudentID " ).IsLessThanOrEqualTo( 10 ).ExecuteReader();
把5 和 10 用动态变量替换一下就够了,对不?
第二种,不建议,我只是教你 In() 的用法,不过好像4.0用不了,我看它的错误,好像只能用在framework 2.0 里面的
ArrayList list = new ArrayList(); for ( int i = 5 ; i <= 10 ; i++ ) { list.Add(i); } IDataReader dr = new Query( " Student " ).IN( " StudentId " , list).ExecuteReader();
或者
IDataReader dr = new Query( " Student " ).IN( " StudentId " , new object []{ 5 , 6 , 7 , 8 , 9 , 10 }).ExecuteReader();
我在4.0里面失败了! Query 我在这里就不细讲了,我会在一个地方,将它细讲的,看不懂的有疑问的,先放着吧,因为我发现query有好多用法
先暂时写在这,今天上午公司有事,我一直忙到了下午4点多,不好意思,我会尽快写好的,请关注,谢谢,今天下班了,明天继续写了,拜拜
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息