C# 可重用数据库类

C# 可重用数据库类,c#,sql,sql-server,database,class,C#,Sql,Sql Server,Database,Class,我有以下代码来查询数据库、获取数据、设置对象的每个属性,然后返回该对象。在这种情况下,它是具有属性FinancialImpactId和EffectiveDate的影响对象。 在整个项目中,我使用数据库中具有关联属性名称的对象多次查询数据库,如下面的示例所示 有没有一种方法可以创建一个通用的可重用类,该类将接受以下参数:要返回的对象或类型、连接和查询文本 然后,它将返回对象并设置每个属性,如下所示,但是是动态的,并且是可重用的 try { using (var conn = new Sql

我有以下代码来查询数据库、获取数据、设置对象的每个属性,然后返回该对象。在这种情况下,它是具有属性
FinancialImpactId
EffectiveDate
的影响对象。 在整个项目中,我使用数据库中具有关联属性名称的对象多次查询数据库,如下面的示例所示

有没有一种方法可以创建一个通用的可重用类,该类将接受以下参数:要返回的对象或类型、连接和查询文本

然后,它将返回对象并设置每个属性,如下所示,但是是动态的,并且是可重用的

try
{
    using (var conn = new SqlConnection())
    {
        conn.ConnectionString = connection.ConnectionString;
        conn.Open();

        using (var cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = " SELECT TOP 1 fi.financialimpactid, 
                               fi.effectivedate " +
                              " FROM FinancialImpact fi " +
                              " INNER JOIN [Case] c ON c.caseid = 
                                fi.caseid " +
                              " WHERE fi.isDeleted = 0 AND 
                                c.IsDeleted = 0";

            var reader = cmd.ExecuteReader();
            if (reader.HasRows)
            {
                reader.Read();

                impact.FinancialImpactId = reader.GetInt32(0);
                impact.EffectiveDate = reader.GetDateTime(1);
            }


        }
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
在这里,类ORM当然是更好的选择,但是您完全可以创建一个类,以这种方式查询数据库。您不会有参数化的查询或事务,而且在可重用性方面也不会节省那么多,因为每次调用它时,您都需要提供大量代码,以使其首先发挥作用

举个例子。以查询类为例:

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

namespace QueryExample {
    public class Query {
        private readonly SqlConnection _connection;

        public Query(SqlConnection connection) {
            _connection = connection;
        }

        public IEnumerable<T> Run<T>(string text, Func<SqlDataReader, T> builder) {
            var results = new List<T>();

            try {
                _connection.Open();

                using (var command = new SqlCommand()) {
                    command.Connection = _connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = text;

                    var reader = command.ExecuteReader();

                    if (reader.HasRows)
                        while (reader.Read())
                            results.Add(builder(reader));
                }

                _connection.Close();
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }

            return results;
        }
    }
}
您可以看到,运行该类并没有给您带来多少可用性,特别是因为您总是需要返回一个结果(使
插入到
更新
删除
“结果构建器”更难定义),而且它总是必须是一个列表(问题没那么大,但总是要做一个空检查,访问第一条记录可能很快就会过时)


这就是你现在使用ORM的原因之一。它们不仅简化了查询创建,而且使参数化变得不必要。

你考虑过使用ORM吗?例如实体框架?不要再发明轮子:)@DaleBurrell还没有。我会调查的。谢谢来自微软的一组文档,强调了做同样事情的各种方法,你可以尝试linqtosql,因为轻量级的ORMLinqtosql已经不存在了
using System;
using System.Data.SqlClient;

namespace QueryExample {
    public class Example {
        public static void Run() {
            using (var connection = new SqlConnection(string.Empty)) {
                var query = new Query(connection);
                const string text = "SELECT TOP 1 fi.financialimpactid, " +
                    "fi.effectivedate " +
                    " FROM FinancialImpact fi " +
                    " INNER JOIN [Case] c ON c.caseid = " +
                    "fi.caseid " +
                    " WHERE fi.isDeleted = 0 AND " +
                    "c.IsDeleted = 0";
                var results = query.Run(text, GetData);
                // do something with the results
            }
        }

        private static Data GetData(SqlDataReader reader) => new Data {
            FinancialImpactId = reader.GetInt32(0),
            EffectiveDate = reader.GetDateTime(1)
        };
    }

    internal class Data {
        public int FinancialImpactId { get; set; }
        public DateTime EffectiveDate { get; set; }
    }
}