Создание класса доступа к данным для всех программ или отдельных C # - PullRequest
0 голосов
/ 14 ноября 2018

Так что название немного расплывчато, но вопрос на самом деле такой: на практике лучше создать класс доступа к данным, в данном случае доступ к SQL Server.

Где все статические методыкласса нужна строка подключения и оператор SQL?

Что-то вроде этих строк:

public static void ExecuteSql(string connStr, string strSqlStatement)
{
    SqlConnection conn = new SqlConnection(connStr);
    conn.Open();

    SqlCommand cmd = new SqlCommand(strSqlStatement, conn);
    cmd.ExecuteNonQuery();

    conn.Close();
    conn.Dispose();
}

И затем метод, который делает нечто подобное, за исключением того, что он возвращает запрашиваемые вами данные.

Или на практике лучше создать объект для конкретного приложения, которое вы создаете, и кодировать эти элементы как расширения объектов.Таким образом, SQL для запуска или хранимая процедура для выполнения будет заключена в этот класс.

 obj.GetSomethingViaQueryThatIsWrittenInTheClassLibrary()

Так что я думаю, что первый больше похож на библиотеку служб для доступа и записи данных в базе данных SQL Server.Что обычно делают в этой ситуации?

Или вы могли бы даже использовать сервисную библиотеку в тандеме с библиотекой объектов?

Существует масса не противоречивых, но разных мнений о доступе к данным, и я действительно пытаюсь понять, что является более распространенной практикой.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я не согласен с Терри, потому что:

Соединения объединены , поэтому открытие / закрытие соединений не является проблемой, и вы не хотите использовать одно соединение для выполнения несколькихпараллельные запросы.Это очень полезно при наличии множества параллельных потоков (например, веб-серверов), но это также относится к обычному приложению (которое может использовать Задачи для извлечения данных в отдельном потоке, чтобы поддерживать отзывчивость пользовательского интерфейса)

Поэтому я бы создалкласс ConnectionManager, который использует строку подключения в качестве параметра конструктора, поэтому строка подключения не будет «перемещаться» по вашей программе и инкапсулируется в объекте «manager».

Это плохой пример, но я думаю, что он прекрасно работает при использовании ADO.NET

public class ConnectionManager
{
    private string _connectionString;

    public ConnectionManager(string connectionString)
    {
        _connectionString = connectionString;
    }

    public SqlConnection GetConnection()
    {
        return new SqlConnection(_connectionString);
    }
}

Тогда я бы использовал что-то вроде:

var connectionManager = new ConnectionManager(connectionString);


using(var con = connectionManager.GetConnection())
{
    // not all operations require .Open()/.Close()

    // multiple queries.
}

using(var con = connectionManager.GetConnection())
{
    // not all operations require .Open()/.Close()

    // multiple other queries.
}

При использовании using соединение будет удалено (помещено обратно в пул)


Вы можете даже использовать что-то вроде:

public class ConnectionManager
{
    private string _connectionString;

    public ConnectionManager(string connectionString)
    {
        _connectionString = connectionString;
    }

    public void ExecuteNonQuery(string strSqlStatement)
    {
        using(var connection = new SqlConnection(_connectionString))
        using(var command = new SqlCommand(strSqlStatement, connection))
        {
            connection.Open();
            command.ExecuteNonQuery();
        }
    }
}

Что составляет:

var connectionManager = new ConnectionManager(connectionString);

connectionManager.ExecuteNonQuery("SELECT * FROM Whatever");

Совет: Вам обязательно нужно проверить SqlParameter , чтобы предотвратить SQL-инъекцию

0 голосов
/ 14 ноября 2018

Я бы не создавал, не открывал и не закрывал соединение в таком методе sql execute. Вместо этого я рекомендую создавать соединение и передавать его в метод запроса каждый раз, когда требуется запрос, и когда все запросы завершены, затем закройте соединение.

...