User Tools

Site Tools


wiki:blog:абстракция_от_sql_в_c

Абстракция от Sql в C#

Дано: Имеется база данных с табличкой users(столбцы userID, и userName)

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

Мое решение:

public static class SqlService
{
    private static string connectionString = "CONNECTION_STRING_HERE";
 
    // это позволит нам быстро создавать соединение
    public static SqlConnection Connection {
        get {
            return new SqlConnection(connectionString);
        }
    }
 
    // выполняем команду оставляя соединение в исходном состоянии
    private static void myExecute(this SqlCommand command) {
        bool connectionOpened =
            (command.Connection.State == ConnectionState.Open);
 
        if (!connectionOpened) {
            try {
                command.Connection.Open();
            }
            catch { throw; }
        }
 
        try {
            command.ExecuteNonQuery();
        }
        catch { throw; }
        finally {
            if (!connectionOpened) {
                command.Connection.Close();
            }
        }
    }
 
    public static void AddUser(Guid userID,
                               string userName,
                               SqlConnection connection = null) {
        //если соединение не передается в аргументе создаем новое
        SqlConnection con = connection ?? Connection;
        SqlCommand com =
            new SqlCommand("INSERT INTO users(userID, userName)"
                         + " VALUES(@userID, @userName)", con);
        com.Parameters.Add("@userID", SqlDbType.UniqueIdentifier);
        com.Parameters.Add("@userName", SqlDbType.NVarChar, 256);
        com.Parameters["@userID"].Value = userID;
        com.Parameters["@userName"].Value = userName;
        try {
            com.myExecute();
        }
        catch { throw; }
    }
 
    public static void DeleteUser(Guid userID,
                                  SqlConnection connection = null) {
        SqlConnection con = connection ?? Connection;
        SqlCommand com = new SqlCommand("DELETE FROM users"
                                       + " WHERE userID=@userID", con);
        com.Parameters.Add("@userID", SqlDbType.UniqueIdentifier);
        com.Parameters["@userID"].Value = userID;
        try {
            com.myExecute();
        }
        catch { throw; }
    }
}

Пример использования:

static void Example() {
    Guid newUserID = Guid.NewGuid();
 
    // простое действие
    // соединение создалось, открылось и закрылось
    SqlService.AddUser(newUserID, "MrSmith");
 
    // специфичное действие
    using (SqlConnection connection = SqlService.Connection) {
        connection.Open();
 
        //команда выполнилась, соединение осталось открытым
        SqlService.DeleteUser(newUserID, connection);
 
        //выполняем любые действия используя то же соединение
        SqlCommand specCom = new SqlCommand(specComText, connection);
        specCom.ExecuteNonQuery();
    }
}

original url: http://blog.c0f3.net/2013/08/sql-db-c.html

wiki/blog/абстракция_от_sql_в_c.txt · Last modified: 2019/01/05 12:32 by kpc