好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SubSnoic 框架

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/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于SubSnoic 框架的详细内容...

  阅读:40次