Dictionary jako parametry funkcji SQL

Dictionary jako parametry funkcji SQL
RK
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:49
0

Witam.
Napisalem sobie funkcje:

Kopiuj
        public static void RunStoredProcedureParam(string ProcedureName, Dictionary<string, string> parameters = null)
        {
            using (SqlConnection objConn = CreateConnection())
            {
                SqlCommand command = new SqlCommand(ProcedureName, objConn);
                try
                {
                    command.CommandType = CommandType.StoredProcedure;

                    if (parameters != null)
                    {
                        foreach (var pair in parameters)
                        {
                            command.Parameters.AddWithValue(pair.Key, pair.Value);
                        }
                    }

                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show("Blad wywolania procedury skladowej!"+"\r\n"+ex.ToString());
                }
            }
        } 

Funkcja dziala dobrze dopoki paramatery sa takiego samego typu.
Utworzylem sobie jednak procedure w MSSQL typu dbo.RekordDodajEdytuj, w ktorej zawarlem warunek, ze jesli ID jest NULL to procedura tworzy nowy rekord ale jesli dostaje konkretna wartosc to dokonuje zmian w rekordzie.

ID jest typu INT.

No ale teraz zdefiniowanie parametrow:

Kopiuj
            Dictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("@Id", null);
            dict.Add("@Nip", textBox1.Text.ToString());
            dict.Add("@Regon", textBox2.Text.ToString());
            dict.Add("@Nazwa", textBox3.Text.ToString());
   

wyrzuca mi blad, mowiacy o niezgodnosci typow.

Mozemy porzucic moj pomysl i zadac pytanie. Jak wywolac w programie c# procedure w mssql o roznych typach parametrow?

dam1an
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
  • Postów:1589
1

A próbowałeś Dictionary<string, object>?
Ale moim zdaniem najprościej, najbardziej elegancko i po bożemu byłoby zaorać te procedury bo od insertów i updatów są ORMy.

RK
Chcialem stworzyc funkcje, ktora wywolywalaby procedure SQL niezaleznie od ilosci i rodzaju parametrow. Zastosowanie object zmusi mnie do weryfikacji typu parametru wewnatrz funkcji. Ale to tez bez sensu bo musialbym przeslac tez typ. A skoro tak to lepiej od razu przekazac do tej funkcji tablice o 3 polach: nazwa parametru, wartosc, typ parametru. Inne glupie rozwiazanie przesylac same stringi a w procedurze SQL CAST'owac. Znalazlem cos takiego w NET 4: Dictionary<string, dynamic> - musze sprobowac.
RK
Do ORM nie jestem przekonany. Najwiekszy polski ERP Comarch Optima, stoi na calej logice zapisanej w SQL.
DibbyDum
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Polska, Kraków
0

Jeśli na przykład NIP lub REGON nie są stringami/tekstem a intem/liczbą to nie przekazuj je jako string/tekst.

Więc bardziej pasuje coś takiego (pisane z palca):

Kopiuj
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("@Id", null);
dict.Add("@Nip", int.Parse(textBox1.Text.ToString()));
dict.Add("@Regon", int.Parse(textBox2.Text.ToString()));
dict.Add("@Nazwa", textBox3.Text.ToString());

Dodatkowo możesz być jeszcze bardziej dokładny i w pętli określać konkretny typ:

Kopiuj
command.Parameters.Add("@Nip", SqlDbType.Int);
command.Parameters["@Nip"].Value = int.Parse(textBox1.Text.ToString());

Yubby dibby dibby dibby dibby dibby dibby dum..
edytowany 5x, ostatnio: DibbyDum
dam1an
btw nipu i regonu to bym jako liczby nie zapisywał, co jeśli będzie 0 z przodu?
DibbyDum
Ale ja nie mówię że powinno być, odnoszę się tylko do samego błędu, prawdopodobnie któryś parametr procedury nie jest tekstem a mimo tego wszędzie dał string w parametrach.
dam1an
Spoko, tak tylko piszę bo komuś może przyjść do głowy że fajnie by było tak zrobić :D
somekind
Szkoda, że nie można już minusować postów za te juniorskie pomysły z uznawaniem numerów i liczb za to samo. :(
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Wrocław
1
RafalKan napisał(a):

Jak wywolac w programie c# procedure w mssql o roznych typach parametrow?

Utwórz sobie prostą klasę przechowującą nazwę parametru, jego typ i wartość, a następnie do metody RunStoredProcedure przekaż kolekcję obiektów takiej klasy.

Nie kombinuj z object ani tym bardziej dynamic. Dictionary też Ci nie jest potrzebne.

A najlepiej to przestań wynajdować koło na nowo, bo tylko namęczysz się z własną implementacją ORMa, a efekt i tak nie będzie najlepszy.

RK
Kiedys piszac programy pod MySQL bralo sie API takiego silnika, pisalo klase posrednia do takiego API i na tym budowalo aplikacje. Rozumiem, ze radzisz mi odejsc od tego podejscia (pisanie wslasnej klasy do obslugi bazy danych) i zapoznanie sie z np. Entity Framework?
somekind
Tak, np. EF albo jakiś inny ORM, który zajmie się całą żmudną pracą przepisywania obiektów na relacje i z powrotem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.