Fork me on GitHub
SubSnoic 框架

SubSnoic 框架入门到提高

关于这个框架的介绍我就不说了,网上很多,我只教基本用法,基本逻辑语句写法

以sqlserver2008+SubSonic 2.2+VS2010

 

为了让学习者能顺利学习,我已将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

然后把 SubSonicDAL层下的app.config文件复制到 SubSonicUI 程序集下,注意你添加的控制台默认使用的framework是 .Net FrameWork4 Client Profile,将它改成 .Net FrameWork4

如图:

 

然后添加 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点多,不好意思,我会尽快写好的,请关注,谢谢,今天下班了,明天继续写了,拜拜

 

 

 

posted on 2012-05-22 20:47  HackerVirus  阅读(277)  评论(0编辑  收藏  举报