zoukankan      html  css  js  c++  java
  • 【ORM】关于Dapper的一些常见用法

    引言

         Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper.

    相关资料

         Dapper的GitHub地址是dapper-dot-net,上面有一些用法和性能的介绍,有兴趣者可以上去看看.

    数据库设计和实体类

        简单设计两个表,分别为部门表,雇员表.

    CREATE TABLE [dbo].[T_Dept] (
        [Id]     INT        IDENTITY (1, 1) NOT NULL,
        [Dept]   NCHAR (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [DeptNo] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    CREATE TABLE [dbo].[T_Employee] (
        [Id]           INT        IDENTITY (1, 1) NOT NULL,
        [DeptNo]       NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [EmployeeName] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );

      实体类如下

       class Depts
        {
            public int Id { get; set; }
            public string Dept { get; set; }
            public string DeptNo { get; set; }
    
            public List<Employees> EmployeeList { get; set; }
        }
    
        class Employees
        {
            public int Id { get; set; }
            public string DeptNo { get; set; }
            public string EmployeeName { get; set; }
        }

    连接静态类

      public static class SqlServerConnect
        {
            public static SqlConnection SqlConnection()
            {
                string sqlconnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                var connection = new SqlConnection(sqlconnectionString);
                connection.Open();
                return connection;
            }
    
        }

    Insert

        Insert有几种写法,分别直接绑定参数,数组,或者集合,Execute的返回值是指受影响的行数.

                   using (SqlConnection con = SqlServerConnect.SqlConnection())
                  {

                    //直接绑定参数
                    con.Execute("insert into T_Dept(Dept,DeptNo) values (@dept,@deptno) ", new { Dept = "销售部", Deptno = "1" });
                    //匿名数组
                    con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
                     new[] { new { EmployeeName = "李四", DeptNo = "1" }, new { EmployeeName = "张三", DeptNo = "1" } });
                    //集合
                    List<Employees> employees = new List<Employees>();
                    employees.Add(new Employees { DeptNo = "2", EmployeeName = "老王" });
                    employees.Add(new Employees { DeptNo = "2", EmployeeName = "老李" });
                    con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@employeeName,@deptNo) ", employees);
    }

     Update和Delete

         Update和Delete没什么好说的了,用法一样,举例匿名数组的用法

        using (SqlConnection con = SqlServerConnect.SqlConnection())
    {
    con.Execute("update T_Dept set Dept=@name where DeptNo=@deptno ",new[] { new { name = "人事部二", deptno = "3" },new { name = "销售部二", deptno = "1" } }); con.Execute("delete from T_Employee where EmployeeName=@name ", new[] { new { name = "小王" }, new { name = "张三" } });
    }

    Select

        Select操作主要是利用Query方法,也可以利用ExecuteScalar做一些获取数据库时间之类的操作,如下

             using (SqlConnection con = SqlServerConnect.SqlConnection())
                {
                   IEnumerable<Depts> deptList = con.Query<Depts>("select id, Dept,DeptNo  from  T_Dept");
    
                   DateTime  dateTime= con.ExecuteScalar<DateTime>("select  getdate()");
    
                   Console.WriteLine(dateTime);
               }

    存储过程

       主要演示一下输入输出参数的过程和返回多游标的过程.

       过程如下

    CREATE PROCEDURE [dbo].P_Emploee_Ins
        @In_DeptNo NVARCHAR(20) ,
        @In_EmployeeName NVARCHAR(20),
        @Out_Message  NVARCHAR(20) output
    AS
     
         insert  into T_Employee( DeptNo, EmployeeName) values (@In_DeptNo,@In_EmployeeName);
         set @Out_Message='完成';
    
    CREATE PROCEDURE [dbo].P_DeptEmploee_Sel
        @In_DeptNo NVARCHAR(20) ,
        
        @Out_Message  NVARCHAR(20) output
    AS
        SELECT * from  T_Dept t  where t.DeptNo=@In_DeptNo;
        SELECT * from  T_Employee t  where t.DeptNo=@In_DeptNo;

       调用如下

           using (SqlConnection con = SqlServerConnect.SqlConnection())
                {
                    DynamicParameters p = new DynamicParameters();
                    p.Add("@In_DeptNo", "3");
                    p.Add("@In_EmployeeName", "小李");
                    p.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output);
                    con.Execute("dbo.P_Emploee_Ins", p, commandType: CommandType.StoredProcedure);
                    string message = p.Get<string>("@Out_Message");
                }
          using (SqlConnection con = SqlServerConnect.SqlConnection())
                {
                    DynamicParameters p2 = new DynamicParameters();
                    p2.Add("@In_DeptNo", "3");
                    p2.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output);
    
                    SqlMapper.GridReader gridReader = con.QueryMultiple("dbo.P_DeptEmploee_Sel", p2, commandType: CommandType.StoredProcedure);
    
                    IEnumerable<Depts> dept = gridReader.Read<Depts>();
                    IEnumerable<Employees> employee = gridReader.Read<Employees>();
    
                    string message2 = p.Get<string>("@Out_Message");
                }

    事务操作

          using (SqlConnection con = SqlServerConnect.SqlConnection())
                {
                    IDbTransaction transaction = con.BeginTransaction();
                    con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
                    new { EmployeeName = "老王", DeptNo = "3" }, transaction: transaction);
                    con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
                    new { EmployeeName = "老李", DeptNo = "3" }, transaction: transaction);
                    transaction.Commit();
                }

    小结

         本文介绍了Dapper的一些常见用法,而.Net4.5版的还有上述方法的异步实现的,这里就不一一示范了.话说以前都是连Oracle数据的,换成Sql Server用法几乎没有变化,感觉真好.如果你有更好的建议,请不吝留言指教.

  • 相关阅读:
    C# Volatile
    C#索引器
    04Prism WPF 入门实战 Module
    No module named '_bz2'
    pandas day01
    实例讲解虚拟机3种网络模式(桥接、nat、Hostonly)
    asp.net 截屏 截取web页面
    c# winform 截图 网页
    delphi AddObject 用法
    DBGrid 更变数据内容显示
  • 原文地址:https://www.cnblogs.com/caizl/p/4570267.html
Copyright © 2011-2022 走看看