четверг, 29 августа 2013 г.

Абстракция от 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();
    }
}

Комментариев нет:

Отправить комментарий