Jak napsat třídu pro práci s MS SQL Serverem

Při asi mých 6ti projektech, ve kterých jsem používal SQLite DB, jsem si napsal množství tříd, které mi pomáhaly a v určitém smyslu i automatizovaly práci s databází. Proto když jesm se naučil takto jednoduché SQLite jsem přešel na složitější SQL Server.

Je to i proto že na ASPone mám k dispozici MS SQL DB o velikosti 30MB ale nikdy jsem ji nevyužíval a taky proto že jsem je musel pokaždé zadat o FullTrust práva a je jen jejich dobrá vůle, že mi pokaždé vyhověli, za což ASPone děkuji. A teď k samotné třídě, jak ji napsat, v SQLite se vše dalo řešit pomocí obyčejných stringů, dokonce i zápis bytů byl jednoduchý – X'{bajty v hex formátu‘. Null se do DB ukládalo tak že jste mu zapsali NULL.

U SQL serveru je to trochu jinak, zde hrají prim parametry. Pro přidávání parametrů jsem si napsal tuto metodu:

C#
private static void AddCommandParameter(SqlCommand comm, int i, object o) {
    if (o == null) {
        //-Pokud chcete uložit null do DB, musíte nastavit hodnotu parametru na DBNull.Value
        comm.Parameters.AddWithValue("@p" + i.ToString(), DBNull.Value);
    }
    else if (o.GetType() == typeof(SqlParameter)) {
        //-Pokud chcete uložit null do Image, nezbývá vám nic jiného než jako hodnotu dát SqlParameter, kde zadáte SqlDbType a value[object]. Pak zde doplňte jen jméno parametru(já používám @pX - počáteční číslo si samozřejmě můžete zvolit libovolně, já mám 0, protože ve VS existuje snippet for, který začíná nulou, takže když chci přidat více parametrů přes smyčku, stačí použít tento snippet a tuto metodu. Také to je pouze @pX protože pak jsou sql dotazy nejrychlejší - sql serveru ušetříte práci s porovnáváním dlouhých řetězců
            SqlParameter param = (SqlParameter) o;
            param.ParameterName = "@p" + i.ToString();
            comm.Parameters.Add(param);
        }
        else if (o.GetType() == typeof(byte[])) {
            //-Pokud chcete uložit pole bajtů, musíte nejdřív vytvořit parametr s typem v DB(já používám vždy Image) a teprve pak nastavit hodnotu
            SqlParameter param = comm.Parameters.Add("@p" + i.ToString(), SqlDbType.Image);
            param.Value = o;
        }
        else {
            //-Pro všechny ostatní případy, zavolám metodu AddWithValue()
            comm.Parameters.AddWithValue("@p" + i.ToString(), o);
        }
    }

A nakonec jak se přidávají parametry do sql dotazu pomocí mé metody:

C#
/// <summary>
/// Název metody je sice OneRow ale updatuje to libovolný počet řádků které to najde pomocí where - je to moje interní pojmenování aby mě to někdy trklo, možná později přijdu na způsob jak updatovat jen jeden řádek.
/// </summary>
public int UpdateOneRow(string table, string sloupecKUpdate, object n, string sloupecID, object id) {
    string sql = string.Format("UPDATE {0} SET {1}=@p1 WHERE {2} = @p2", table, sloupecKUpdate, sloupecID);
    SqlCommand comm = new SqlCommand(sql, conn);
    AddCommandParameter(comm, 1, n);
    AddCommandParameter(comm, 2, id);
    int vr = comm.ExecuteNonQuery();
    return vr;
}

Tak a teď už to máte strašně jednoduché. Pamatujte si, kdykoliv budete chtít do SQL serveru předat jakákoliv data, musíte to udělat přes parametr. Jedině tak zajistíte bezchybnou funkčnost! Nezapomeňte si napsat metody, které vám budou kontrolovat na DBNull.Value a když vrácená hodnota bude tato, tak vrátit null. Tak se vám nebude plést v aplikaci DBNull.Value s klasickou null hodnotou.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *