Dictionary jako parametry funkcji SQL

Dictionary jako parametry funkcji SQL
RK
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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.

DibbyDum
  • Rejestracja: dni
  • Ostatnio: dni
  • 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());
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

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.