Многоразовый класс базы данных - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующий код для запроса базы данных, получения данных, установки каждого свойства для объекта, а затем возврата этого объекта.В этом случае это ударный объект со свойствами FinancialImpactId и EffectiveDate.На протяжении всего проекта я выполняю запросы к базе данных несколько раз, как в примере ниже, используя объекты, которые имеют ассоциированное имя свойства в базе данных.

Есть ли способ создать универсальный класс многократного использования, который будет принимать следующие параметры: objectили тип, соединение и текст запроса?

Затем он будет возвращать объект и устанавливать каждое свойство, как показано ниже, но динамически и будет использоваться повторно.

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);
}

1 Ответ

0 голосов
/ 12 декабря 2018

ORM, такой как Entity Framework , безусловно, является лучшим вариантом здесь, но вы можете абсолютно создать класс, который мог бы запрашивать базу данных таким образом.У вас не будет параметризованных запросов или транзакций, и вы действительно не будете экономить так много для повторного использования, так как каждый раз, когда вы вызываете его, вам нужно будет предоставить много кода, чтобы он начал функционировать.

Пример.Возьмите класс запроса:

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;
        }
    }
}

... теперь возьмем пример запуска этого класса:

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; }
    }
}

Вы видите, что запуск класса не дает вам такой юзабилити,тем более что вам всегда придется возвращать результат (что затрудняет определение «конструкторов результатов» INSERT INTO, UPDATE и DELETE), и он всегда должен быть списком (не такой большой проблемой, новсегда нужно делать пустую проверку, и доступ к первой записи может быстро устареть)?

Это одна из причин, почему вы используете ORM в настоящее время.Они не только упрощают создание запросов, но и делают ненужной параметризацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...