Pri asi mych 6ti projektech, ve kterych jsem pouzival SQLite DB, jsem si napsal mnozstvi trid, ktere mi pomahali a v urcitem smyslu i automatizovali praci s databazi. Proto kdyz jesm se naucil takto jednoduche SQLite jsem presel na slozitejsi SQL Server.
Je to i proto ze na ASPone mam k dispozici MS SQL DB o velikosti 30MB ale nikdy jsem ji nevyuzival a taky proto ze jsem je musel pokazde zadat o FullTrust prava a je jen jejich dobra vule, ze mi pokazde vyhoveli, za coz ASPone dekuji. A ted k samotne tride, jak ji napsat, v SQLite se vse dalo resit pomoci obycejnych stringu, dokonce i zapis bytu byl jednoduchy – X'{bajty v hex formatu’. Null se do DB ukladalo tak ze jste mu zapsali NULL.
U SQL serveru je to trochu jinak, zde hraji prim parametry. Pro pridavani parametru jsem si napsal tuto metodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private static void AddCommandParameter(SqlCommand comm, int i, object o) { if (o == null) { //-Pokud chcete ulozit null do DB, musite nastavit hodnotu parametru na DBNull.Value comm.Parameters.AddWithValue("@p" + i.ToString(), DBNull.Value); } else if (o.GetType() == typeof(SqlParameter)) { //-Pokud chcete ulozit null do Image, nezbyva vam nic jineho nez jako hodnotu dat SqlParameter, kde zadate SqlDbType a value[object]. Pak zde doplnite jen jmeno parametru(ja pouzivam @pX - pocatecni cislo si samozrejme muzete zvolit libovolne, ja mam 0, protoze ve VS existuje snippet for, ktery zacina nulou, takze kdyz chci pridat vice parametru pres smycku, staci pouzit tento snippet a tuto metodu. Take to je pouze @pX protoze pak jsou sql dotazy nejrychlejsi - sql serveru usetrite praci s porovnavanim dlouhych retezcu SqlParameter param = (SqlParameter) o; param.ParameterName = "@p" + i.ToString(); comm.Parameters.Add(param); } else if (o.GetType() == typeof(byte[])) { //-Pokud chcete ulozit pole bajtu, musite nejdriv vytvorit parametr s typem v DB(ja pouzivam vzdy Image) a teprve pak nastavit hodnotu SqlParameter param = comm.Parameters.Add("@p" + i.ToString(), SqlDbType.Image); param.Value = o; } else { //-Pro vsechny ostatni pripady, zavolam metodu AddWithValue() comm.Parameters.AddWithValue("@p" + i.ToString(), o); } } |
A nakonec jak se pridavaji parametry do sql dotazu pomoci me metody:
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// Nazev metody je sice OneRow ale updatuje to libovolny pocet radku ktere to najde pomoci where - je to moje interni pojmenovani aby me to nekdy trklo, mozna pozdeji prijdu na zpusob jak updatovat jen jeden radek. /// </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 ted uz to mate strasne jednoduche. Pamatujte si, kdykoliv budete chtit do SQL serveru predat jakakoliv data, musite to udelat pres parametr. Jedine tak zajistite bezchybnou funkcnost! Nezapomente si napsat metody, ktere vam budou kontrolovat na DBNull.Value a kdyz vracena hodnota bude tato, tak vratit null. Tak se vam nebude plest v aplikaci DBNull.Value s klasickou null hodnotou.