65.9K
CodeProject 正在变化。 阅读更多。
Home

Dapper.NET 和 DapperExtensions 执行存储过程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (10投票s)

2015年9月14日

CPOL

2分钟阅读

viewsIcon

47698

downloadIcon

1430

我们将讨论如何结合 Dapper.NET 和 DapperExtensions 配置 DAL,以执行普通查询以及存储过程。

引言

这是我在 CodeProject 上的第一篇文章。

多年来,我们已经看到了诸如 NHibernate、Entity Framework、Dapper 和 Peta POCO 等对象关系映射器 (ORM)。

我不会在文章中详细讨论所有这些,我的目标是简要介绍 Dapper.NET(微型 ORM)和 DapperExtensions,以便配置我们的 DAL。

背景

如果您不熟悉 Dapp.NET,一篇关于 Dapper.NET 的简要讨论文章已发布 此处

Using the Code

基本上,当我们使用上述任何 ORM 时,我们都会编写通用的代码配置。 同样,我在我的 DAL(数据访问层)中编写了一个 SqlHelper 辅助类,它是通过业务层或 UI 层调用所有 DAL 调用的入口点。

以下是讨论 SqlHelper 类实现的 代码片段

// C#
public static class SqlHelper
{
        public static bool Insert<T>(T parameter, string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                sqlConnection.Insert(parameter);
                sqlConnection.Close();
                return true;
            }
        }
        public static int InsertWithReturnId<T>(T parameter, string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                var recordId = sqlConnection.Insert(parameter);
                sqlConnection.Close();
                return recordId;
            }
        }
        public static bool Update<T>(T parameter, string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                sqlConnection.Update(parameter);
                sqlConnection.Close();
                return true;
            }
        }
        public static IList<T> GetAll<T>(string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                var result = sqlConnection.GetList<T>();
                sqlConnection.Close();
                return result.ToList();
            }
        }
        public static T Find<T>(PredicateGroup predicate, string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                var result = sqlConnection.GetList<T>(predicate).FirstOrDefault();
                sqlConnection.Close();
                return result;
            }
        }
        public static bool Delete<T>(PredicateGroup predicate, 
			string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                sqlConnection.Delete<T>(predicate);
                sqlConnection.Close();
                return true;
            }
        }
        public static IEnumerable<T> QuerySP<T>(string storedProcedure, dynamic param = null,
            dynamic outParam = null, SqlTransaction transaction = null,
            bool buffered = true, int? commandTimeout = null, 
			string connectionString = null) where T : class
        {
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            var output = connection.Query<T>(storedProcedure, param: (object)param, 
            transaction: transaction, buffered: buffered, commandTimeout: commandTimeout, 
            commandType: CommandType.StoredProcedure);
            return output;
        }
        private static void CombineParameters(ref dynamic param, dynamic outParam = null)
        {
            if (outParam != null)
            {
                if (param != null)
                {
                    param = new DynamicParameters(param);
                    ((DynamicParameters)param).AddDynamicParams(outParam);
                }
                else
                {
                    param = outParam;
                }
            }
        }
        private static int ConnectionTimeout { get; set; }
}

以下是使用 Dapp.NET 和 DapperExtension 调用或执行存储过程的关键方法。

//C#
public static IEnumerable<T> QuerySP<T>(string storedProcedure, dynamic param = null,
            dynamic outParam = null, SqlTransaction transaction = null,
            bool buffered = true, int? commandTimeout = null, 
				string connectionString = null) where T : class
        {
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            var output = connection.Query<T>(storedProcedure, param: (object)param, 
		transaction: transaction, buffered: buffered, commandTimeout: commandTimeout, 
		commandType: CommandType.StoredProcedure);
            return output;
        }

上述代码片段中的其他方法被配置为映射您的 CRUD 操作,例如

//C#

public static bool Insert<T>(T parameter, string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                sqlConnection.Insert(parameter);
                sqlConnection.Close();
                return true;
            }
        }

上述方法会将记录插入到类型 T 中,数据库中的名称与类名相同。

//C#

public static IList<T> GetAll<T>(string connectionString) where T : class
        {
            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                var result = sqlConnection.GetList<T>();
                sqlConnection.Close();
                return result.ToList();
            }
        }

上述代码片段从数据库中返回类型 T 的所有记录。

示例已附加到此提示

附件包含 DAL、业务、实体和 Web 层。 ZIP 文件还包含一个名为“Lib”的文件夹,其中包含 Dapper.NET 和 DapperExtension DLL。

引用的数据库备份文件也添加在同一 ZIP 文件中的“DB”文件夹下。

所附代码易于理解,因此我仅提供了基于“User”表的示例。 如果需要,您可以将其扩展为通过将它们添加到相同的源代码或在您的项目中复制它们来使用多个 POCO。

关注点

Dapper.Net 运行于自动映射系统,这意味着您需要添加与数据库中创建的数据表名称相同的数据实体,并且还需要添加与数据库表列相同的属性名称。

摘要

Dapper.NET 与 DapperExtension 配置相结合似乎有点复杂,但通过参考此示例,您不会觉得它很复杂。

我使用的工具是 Visual Studio 2013 Web ExpressSQL Server 2008 R2 Express。 它对我来说工作得很好。

欢迎提出您的建议、问题或疑问。

© . All rights reserved.