Dictionary jako parametry funkcji SQL

Odpowiedz Nowy wątek
2016-12-06 14:36
0

Witam.
Napisalem sobie funkcje:

        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:

            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?

Pozostało 580 znaków

2016-12-06 17:16
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.

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. - RafalKan 2016-12-06 21:13
Do ORM nie jestem przekonany. Najwiekszy polski ERP Comarch Optima, stoi na calej logice zapisanej w SQL. - RafalKan 2016-12-06 21:15

Pozostało 580 znaków

2016-12-06 17:26
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):

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:

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, 2016-12-06 17:28
btw nipu i regonu to bym jako liczby nie zapisywał, co jeśli będzie 0 z przodu? - dam1an 2016-12-06 17:40
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. - DibbyDum 2016-12-06 17:44
Spoko, tak tylko piszę bo komuś może przyjść do głowy że fajnie by było tak zrobić :D - dam1an 2016-12-06 17:56
Szkoda, że nie można już minusować postów za te juniorskie pomysły z uznawaniem numerów i liczb za to samo. :( - somekind 2016-12-07 00:13

Pozostało 580 znaków

2016-12-07 00:21
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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
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? - RafalKan 2016-12-07 07:49
Tak, np. EF albo jakiś inny ORM, który zajmie się całą żmudną pracą przepisywania obiektów na relacje i z powrotem. - somekind 2016-12-07 12:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0