Dapper 基本使用 存储过程 QueryMultiple多个结果集

Dapper_w3cschool【异步,缓冲,事物,存储过程】
SQL Server 存储过程使用   (其中包括 Dapper调用存储过程 示例)

项目右键 Manage NuGet Packages for Solution

搜索Dapper -> Install 

Dapper Execute
Execute 是一种扩展方法,可以从IDbConnection类型的任何对象调用。它可以执行一次或多次命令并返回受影响的行数。此方法通常用于执行。
● 存储过程
● Insert语句
● Update 语句
● Delete 语句

返回“新增自增主键ID”,“统计个数”:ExecuteScalar<int>

_conn.ExecuteScalar<int>("insert into 表名 (name) vaule (@name);SELECT @@IDENTITY;", new { name="dage" });



存储过程示例
conn.Execute("", new { }, null, null, System.Data.CommandType.StoredProcedure);

多个结果集存储过程【proc_multiple_select】

CREATE PROCEDURE [dbo].[proc_multiple_select]
  @page int,
  @per_page int,
  @total int output,
  @page_count int output
AS
BEGIN
    declare @sql_total_string nvarchar(2000) 
	declare @skip int

	set @skip = (case when @page - 1 <= 0 then 0 else @page - 1 end) * @per_page

	select * from sys_department
	select * from sys_user

	set @sql_total_string = N'select @total = count(*) from sys_department'
	exec sp_executesql @sql_total_string,N'@total int out',@total output
	set @page_count = ceiling(@total * 1.0 / @per_page)
END

项目实战【增,删,改,查询1条,查询多条,存储过程,QueryMultiple多个结果集】

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace Dapper.Repository
{
    public class DapperDemo
    {
        public static string ConnectionString
        {
            get
            {
                string _connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
                return _connectionString;
            }
        }

        public SqlConnection OpenConnection()
        {
            SqlConnection connection = new SqlConnection(ConnectionString);
            connection.Open();
            return connection;
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <returns></returns>
        public bool Add()
        {
            int row = 0;
            ED_Data model = new ED_Data();
            model.TableName = "123";
            model.DataKey = "123";
            model.FieldName = "123";
            model.Value = "123";
            model.Reference = "123";
            model.Branch = 1;
            model.InActive = false;
            model.Updated = DateTime.Now;

            string query = "INSERT INTO ED_Data(TableName,DataKey,FieldName,Value,Reference,Branch,InActive,Updated) VALUES (@TableName,@DataKey,@FieldName,@Value,@Reference,@Branch,@InActive,@Updated)";
            using (IDbConnection conn = OpenConnection())
            {
                row = conn.Execute(query, model);
            }
            if (row > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <returns></returns>
        public int Update()
        {
            int row = 0;
            ED_Data model = new ED_Data();
            model.TableName = "123";
            model.DataKey = "123";
            model.Updated = DateTime.Now;
            using (IDbConnection conn = OpenConnection())
            {
                const string query = "UPDATE ED_Data SET DataKey=@DataKey,Updated=@Updated WHERE TableName=@TableName";
                row = conn.Execute(query, model);
            }
            return row;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <returns></returns>
        public int Delete()
        {
            int row = 0;
            ED_Data model = new ED_Data();
            model.TableName = "123";
            using (IDbConnection conn = OpenConnection())
            {
                const string query = "DELETE FROM ED_Data WHERE TableName=@TableName";
                row = conn.Execute(query, model);
            }
            return row;
        }

        /// <summary>
        /// 查询一条数据
        /// </summary>
        /// <param name="columnCatId"></param>
        /// <returns>ED_Data</returns>
        public ED_Data GetModel(string TableName)
        {
            using (IDbConnection conn = OpenConnection())
            {
                const string query = "SELECT * FROM ED_Data WHERE TableName = @TableName";
                return conn.Query<ED_Data>(query, new { tableName = TableName }).SingleOrDefault<ED_Data>();
            }
        }

        /// <summary>
        /// 查询list集合
        /// </summary>
        /// <returns>List</returns>
        public List<ED_Data> GetED_DataList()
        {
            using (IDbConnection conn = OpenConnection())
            {
                const string query = "SELECT * FROM ED_Data";
                return conn.Query<ED_Data>(query, null).ToList();
            }
        }

        /// <summary>
        /// 查询list集合【多个结果集】
        /// </summary>
        /// <returns>List</returns>
        public List<DepartmentDto> GetED_DataList()
        {
            using (IDbConnection conn = OpenConnection())
            {
                const string sql = "select * from sys_department;select count(*) department_code from sys_department;";
                var multiple = conn.QueryMultiple(sql);
                List<DepartmentDto> list = multiple.Read<DepartmentDto>().ToList();
                var total = multiple.Read<DepartmentDto>().FirstOrDefault().department_code;
                return list;
            }
        }

        /// <summary>
        /// 查询list集合【多个结果集】【存储过程】
        /// </summary>
        /// <returns>List</returns>
        public List<DepartmentDto> GetDepartmentList()
        {
            DynamicParameters para = new DynamicParameters();
            para.Add("@page", page.page);
            para.Add("@per_page", page.per_page);
            para.Add("@total", 0, DbType.Int32, ParameterDirection.Output);
            para.Add("@page_count", 0, DbType.Int32, ParameterDirection.Output);

            using (IDbConnection conn = OpenConnection())
            {
                var multiple = conn.QueryMultiple("proc_multiple_select", para, commandType: CommandType.StoredProcedure);
                List<DepartmentDto> list = multiple.Read<DepartmentDto>().ToList();
                List<UserDto> listUser = multiple.Read<UserDto>().ToList();
                total = para.Get<int>("@total");
                pageCount = para.Get<int>("@page_count");
                return list;
            }
        }

        /// <summary>
        /// 事务处理
        /// 删除
        /// </summary>
        /// <param name="cat"></param>
        /// <returns></returns>
        public int DeleteColumnCatAndColumn(ED_Data cat)
        {
            try
            {
                using (IDbConnection conn = OpenConnection())
                {
                    string delete1 = "DELETE FROM ED_Data WHERE TableName=@TableName";
                    string delete2 = "DELETE FROM ED_Data WHERE TableName=@TableName";

                    IDbTransaction transaction = conn.BeginTransaction();
                    int row = conn.Execute(delete1, new { TableName = cat.TableName }, transaction, null, null);
                    row += conn.Execute(delete2, new { TableName = cat.TableName }, transaction, null, null);
                    transaction.Commit();
                    return row;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        
        /// <summary>
        /// 执行存储过程
        /// </summary>
        public void ExecuteStoredProcedure()
        {
            try
            {
                DynamicParameters para = new DynamicParameters();
                para.Add("@param1", 1);
                para.Add("@param2", 2);

                using (IDbConnection conn = OpenConnection())
                {
                    int row = conn.Execute("存储过程名称", para, null, null, CommandType.StoredProcedure);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 新增,返回主键ID值【存储过程】
        /// </summary>
        public int Create(CreateBroadcastRequest data)
        {
            int code = 0;
            DynamicParameters para = new DynamicParameters();
            para.Add("@broadcast_code", 0, DbType.Int32, ParameterDirection.Output);
            para.Add("@contents", data.contents);
            _conn.Execute("存储过程名称", para, commandType: CommandType.StoredProcedure);
            code = para.Get<int>("@broadcast_code");
            return code;
        }

        /// <summary>
        /// 批量添加
        /// </summary>
        public void InsertBatch()
        {
            try
            {
                string sqlStr = "INSERT INTO ED_Data(TableName,DataKey,FieldName,Value,Reference,Branch,InActive,Updated) VALUES (@TableName,@DataKey,@FieldName,@Value,@Reference,@Branch,@InActive,@Updated)";
                using (IDbConnection conn = OpenConnection())
                {
                    conn.Execute(sqlStr, new[] 
                    {
                        new { TableName = "user1", DataKey = "a", FieldName = "name", Value = "000001", Reference = "", Branch = "", InActive = "", Updated = DateTime.Now },
                        new { TableName = "user2", DataKey = "b", FieldName = "age", Value = "000002", Reference = "", Branch= "", InActive = "", Updated = DateTime.Now },
                        new { TableName = "user3", DataKey = "c", FieldName = "phone", Value = "000003", Reference= "", Branch= "", InActive= "", Updated= DateTime.Now },
                    }, null, null, null);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

*

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace Dapper.Repository
{
    public class ED_Data
    {
        public string TableName { get; set; }

        public string DataKey { get; set; }

        public string FieldName { get; set; }

        public string Value { get; set; }

        public string Reference { get; set; }

        public int Branch { get; set; }

        public bool InActive { get; set; }

        public DateTime Updated { get; set; }
    }
}

Base基类

using Dapper.CoreLibrary;
using Dapper.Entity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Transactions;

namespace Dapper.Repository
{
    public abstract class RepositoryBase<T> : DbConnectionFactory, IRepositoryBase<T> where T : IEntityBase<T>
    {
        public RepositoryBase(IDbConnection db) : base(db) { }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public virtual int Add(T model)
        {
            int result = 0;
            try
            {
                var ps = model.GetType().GetProperties();
                List<string> @colms = new List<string>();
                List<string> @params = new List<string>();
                foreach (var p in ps)
                {
                    if (!p.CustomAttributes.Any(x => x.AttributeType == typeof(PrimaryKeyAttribute)) && !p.CustomAttributes.Any(x => x.AttributeType == typeof(DBIgnoreAttribute)))
                    {
                        @colms.Add(string.Format("[{0}]", p.Name));
                        @params.Add(string.Format("@{0}", p.Name));
                    }
                }
                var sql = string.Format("INSERT INTO [{0}] ({1}) VALUES({2}); SELECT @@IDENTITY;", typeof(T).Name, string.Join(", ", @colms), string.Join(", ", @params));
                result = _conn.ExecuteScalar<int>(sql, model);
            }
            catch (Exception ex)
            {
                throw;
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="listModel"></param>
        public virtual void Add(List<T> listModel)
        {
            try
            {
                using (var scope = new TransactionScope())
                {
                    listModel.ForEach(model =>
                    {
                        var ps = model.GetType().GetProperties();
                        List<string> @colms = new List<string>();
                        List<string> @params = new List<string>();
                        foreach (var p in ps)
                        {
                            if (!p.CustomAttributes.Any(x => x.AttributeType == typeof(PrimaryKeyAttribute)) && !p.CustomAttributes.Any(x => x.AttributeType == typeof(DBIgnoreAttribute)))
                            {
                                @colms.Add(string.Format("[{0}]", p.Name));
                                @params.Add(string.Format("@{0}", p.Name));
                            }
                        }
                        var sql = string.Format("INSERT INTO [{0}] ({1}) VALUES({2}); SELECT @@IDENTITY;", typeof(T).Name, string.Join(", ", @colms), string.Join(", ", @params));
                        _conn.ExecuteScalar<int>(sql, model);
                    });
                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public virtual int AddWithGuid(T model)
        {
            int result = 0;
            try
            {
                var ps = model.GetType().GetProperties();
                List<string> @colms = new List<string>();
                List<string> @params = new List<string>();
                foreach (var p in ps)
                {
                    if (!p.CustomAttributes.Any(x => x.AttributeType == typeof(DBIgnoreAttribute)))
                    {
                        @colms.Add(string.Format("[{0}]", p.Name));
                        @params.Add(string.Format("@{0}", p.Name));
                    }
                }
                var sql = string.Format("INSERT INTO [{0}] ({1}) VALUES({2});", typeof(T).Name, string.Join(", ", @colms), string.Join(", ", @params));
                result = _conn.Execute(sql, model);
            }
            catch (Exception ex)
            {
                throw;
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        public virtual void Update(T model)
        {
            PropertyInfo pkInfo = null;
            var ps = model.GetType().GetProperties();
            List<string> @params = new List<string>();
            foreach (var p in ps)
            {
                if (p.CustomAttributes.Any(x => x.AttributeType == typeof(DBIgnoreAttribute)))
                {
                    continue;
                }
                if (p.CustomAttributes.Any(x => x.AttributeType == typeof(PrimaryKeyAttribute)))
                {
                    pkInfo = p;
                }
                else
                {
                    @params.Add(string.Format("[{0}]=@{0}", p.Name));
                }
            }
            var sql = string.Format("UPDATE [{0}] SET {1} WHERE [{2}] = @{2}", typeof(T).Name, string.Join(", ", @params), pkInfo.Name);
            _conn.Execute(sql, model);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="listModel"></param>
        public virtual void Update(List<T> listModel)
        {
            using (var scope = new TransactionScope())
            {
                listModel.ForEach(model =>
                {
                    PropertyInfo pkInfo = null;
                    var ps = model.GetType().GetProperties();
                    List<string> @params = new List<string>();
                    foreach (var p in ps)
                    {
                        if (p.CustomAttributes.Any(x => x.AttributeType == typeof(DBIgnoreAttribute)))
                        {
                            continue;
                        }
                        if (p.CustomAttributes.Any(x => x.AttributeType == typeof(PrimaryKeyAttribute)))
                        {
                            pkInfo = p;
                        }
                        else
                        {
                            @params.Add(string.Format("[{0}] = @{0}", p.Name));
                        }
                    }
                    var sql = string.Format("UPDATE [{0}] SET {1} WHERE [{2}] = @{2}", typeof(T).Name, string.Join(", ", @params), pkInfo.Name);
                    _conn.Execute(sql, model);
                });
                scope.Complete();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="primaryValue">主键ID</param>
        /// <param name="tableName">表名</param>
        /// <returns></returns>
        public virtual T GetModel(string primaryValue, string tableName = "")
        {
            try
            {
                string primaryWhere = string.Empty;
                var ps = typeof(T).GetProperties();
                if (string.IsNullOrEmpty(tableName))
                {
                    tableName = typeof(T).Name;
                }
                var primary = ps.Single(p => p.CustomAttributes.FirstOrDefault(c => c.AttributeType == typeof(PrimaryKeyAttribute)) != null);

                primaryWhere = (string.Format("[{0}] = @primarykey", primary.Name));

                var sql = string.Format("SELECT * FROM [{0}] WHERE {1}", tableName, primaryWhere);

                return _conn.Query<T>(sql, new { primarykey = primaryValue }).FirstOrDefault();
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="strWhere">where条件</param>
        /// <param name="tableName">表名</param>
        /// <returns></returns>
        public virtual T GetModelQuery(string strWhere, string tableName = "")
        {
            try
            {
                var sql = string.Format("SELECT * FROM [{0}] WHERE {1}", tableName, strWhere);
                return _conn.Query<T>(sql, new { where = strWhere }).FirstOrDefault();
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 根据主键删除
        /// </summary>
        /// <param name="primaryValue"></param>
        public virtual void Delete(string primaryValue)
        {
            try
            {
                string primaryWhere = string.Empty;
                var ps = typeof(T).GetProperties();
                var primary = ps.Single(p => p.CustomAttributes.FirstOrDefault(c => c.AttributeType == typeof(PrimaryKeyAttribute)) != null);
                var sql = string.Format("DELETE FROM [{0}] WHERE {1} = @primarykey", typeof(T).Name, primary.Name);
                _conn.Execute(sql, new { primarykey = primaryValue });
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="strWhere"></param>
        public void DeleteStrWhere(string strWhere)
        {
            try
            {
                var sql = string.Format("DELETE FROM [{0}] WHERE {1}", typeof(T).Name, strWhere);
                _conn.Execute(sql);
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="strWhere"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public virtual List<T> GetList(string strWhere, string tableName = "")
        {
            try
            {
                if (string.IsNullOrEmpty(tableName))
                    tableName = typeof(T).Name;
                var sql = string.Format("SELECT * FROM [{0}] " + (strWhere == "" ? "" : " WHERE " + " {1} "), tableName, strWhere);
                return _conn.Query<T>(sql).ToList();
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public virtual PagerListResult<List<T>> GetPageList(PagerRequestParam param)
        {
            PagerListResult<List<T>> result = null;
            List<T> list = new List<T>();
            int pageTotal = 1;
            int recordTotal = 0;
            int startIndex = 1;
            int endIndex = param.PageSize;
            try
            {
                if (param.PageIndex - 1 > 0)
                {
                    startIndex = (param.PageIndex - 1 <= 0 ? 1 : param.PageIndex - 1) * param.PageSize + 1;
                    endIndex = param.PageIndex * param.PageSize;
                }

                if (string.IsNullOrEmpty(param.TableName))
                    param.TableName = typeof(T).Name;
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT * FROM ( ");
                strSql.Append(" SELECT ROW_NUMBER() OVER (");
                if (!string.IsNullOrEmpty(param.OrderBy))
                {
                    strSql.Append("ORDER BY T." + param.OrderBy);
                }
                else
                {
                    strSql.Append("ORDER BY T.ID DESC");
                }
                strSql.Append(")AS Row, T.*  FROM " + param.TableName + " T ");
                if (!string.IsNullOrEmpty(param.StrWhere))
                {
                    strSql.Append(" WHERE " + param.StrWhere);
                }
                strSql.Append(" ) TT");
                strSql.AppendFormat(" WHERE TT.Row BETWEEN {0} AND {1}", startIndex, endIndex);

                list = _conn.Query<T>(strSql.ToString(), param.StrWhere).ToList();
                if (list.Count > 0)
                {
                    recordTotal = this.GetRecordCount(param.StrWhere, param.TableName);
                    pageTotal = PagerRequestParam.Tool.PageTotal(param);
                }
                result = new PagerListResult<List<T>>(list, pageTotal, recordTotal);
            }
            catch (Exception ex)
            {
                result = new PagerListResult<List<T>>(ex);
            }
            return result;
        }

        /// <summary>
        /// 事务处理
        /// Demo
        /// </summary>
        /// <returns></returns>
        public int DeleteTransaction()
        {
            try
            {
                const string delete1 = "DELETE FROM ED_Data WHERE TableName=@TableName";
                const string delete2 = "DELETE FROM ED_Data WHERE TableName=@TableName";

                IDbTransaction transaction = _conn.BeginTransaction();
                int row = _conn.Execute(delete1, new { TableName = "user" }, transaction, null, null);
                row += _conn.Execute(delete2, new { TableName = "customer" }, transaction, null, null);
                transaction.Commit();
                return row;
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 获取记录数count()统计
        /// </summary>
        /// <param name="strWhere">Where条件</param>
        /// <returns></returns>
        public virtual int GetRecordCount(string strWhere, string tableName = "")
        {
            int count = 0;
            try
            {
                if (string.IsNullOrEmpty(tableName))
                    tableName = typeof(T).Name;
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT COUNT(1) FROM " + tableName);
                if (!string.IsNullOrEmpty(strWhere))
                {
                    strSql.Append(" WHERE " + strWhere);
                }
                count = _conn.ExecuteScalar<int>(strSql.ToString());
            }
            catch (Exception)
            {

                throw;
            }
            return count;
        }
    }
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Dapper调用存储过程可以通过以下步骤实现: 1. 创建一个存储过程 首先,需要在数据库中创建一个存储过程。例如,创建一个名为“GetUsers”的存储过程,该存储过程返回用户表中的所有用户记录。以下是创建该存储过程的示例SQL语句: CREATE PROCEDURE GetUsers AS BEGIN SELECT * FROM Users END 2. 定义一个模型类 定义一个模型类,该类的属性与存储过程返回的结果中的列相对应。例如,在这个例子中,我们可以定义一个名为“User”的类,该类包含用户表中的所有列: public class User { public int UserId { get; set; } public string UserName { get; set; } public string Email { get; set; } public string Password { get; set; } } 3. 调用存储过程 使用Dapper调用存储过程可以通过以下代码实现: using (var connection = new SqlConnection("connectionString")) { var users = connection.Query<User>("GetUsers", commandType: CommandType.StoredProcedure); } 在上面的代码中,我们首先创建一个SqlConnection对象,该对象表示与数据库的连接。然后,我们调用Query方法,该方法使用存储过程名称作为第一个参数,并使用commandType参数指定命令类型为StoredProcedure。Query方法返回一个IEnumerable<User>对象,该对象包含存储过程返回的所有用户记录。 注意:在调用存储过程时,可以将参数传递给存储过程。可以使用匿名类型或DynamicParameters对象来传递参数。例如: var parameters = new DynamicParameters(); parameters.Add("@UserId", 1); var user = connection.QueryFirstOrDefault<User>("GetUserById", parameters, commandType: CommandType.StoredProcedure); 在上面的代码中,我们首先创建一个DynamicParameters对象,并使用Add方法向该对象添加一个名为“UserId”的参数。然后,我们调用QueryFirstOrDefault方法,该方法使用存储过程名称作为第一个参数,DynamicParameters对象作为第二个参数,并使用commandType参数指定命令类型为StoredProcedure。QueryFirstOrDefault方法返回一个User对象,该对象包含存储过程返回的第一个用户记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值