【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用法几乎没有变化,感觉真好.如果你有更好的建议,请不吝留言指教.

 

你可能感兴趣的:(orm)