Dictionary jako parametry funkcji SQL

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?

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.

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());
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.

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