четверг, 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();
    }
}

1 комментарий:

  1. This gambling site sports an excellent standalone poker platform accessible in obtain and instant play modes. You will uncover different poker variants like Omaha, Texas Hold’em, and extra – all that includes versatile stakes for each 바카라 high-rollers and gamers on a price range. Rebranded as Everygame, Intertops is a top gambling site that we strongly recommend if you’re into bluffing shenanigans or sports betting. You can use 18 cost methods here, together with bank cards, eCheck, Money Gram, Money Orders, a financial institution switch, and 10 cryptocurrencies – with every probability that your most popular one is here.

    ОтветитьУдалить