generowanie wielu zapytań do bazy danych

0

Witam
Zrobiłem metodę która zapisuje do BD wiadomości wysyłane przez użytkownika do innego użytkownika(ów) w systemie.

Metoda pobiera argument obiekt Message, zawierający informacje o wiadomości (tj tytuł, treść itd) oraz List<string> która zawiera nicki użytkowników którym wysyłana zostanie ta wiadomość.

public void insertMessage(Messages newMessage, List<string> sendTo)
        {
            SqlConnection conn = new SqlConnection(_connectionParameters);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;

            foreach (string send in sendTo)
            {
            
                cmd.CommandText = "INSERT Messagess (title, text, autor, sendTo, date, typeOfMessages)" +
                    "VALUES (@title, @text, @autor, @sendTo, @date, @typeOfMessages)";

                cmd.Parameters.AddWithValue("@title", newMessage.Title);
                cmd.Parameters.AddWithValue("@text", newMessage.Text);
                cmd.Parameters.AddWithValue("@autor", newMessage.Autor);
                //zmienia sie tylko parametr sendTo, reszta jest taka sama
                cmd.Parameters.AddWithValue("@sendTo", send);
                cmd.Parameters.AddWithValue("@date", newMessage.Date);
                cmd.Parameters.AddWithValue("@typeOfMessages", newMessage.TypeOfMessages);
            }
            using (conn)
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

Gdy wysyłam wiadomość do jednego użytkownika jest ok. Ale gdy do więcej, wywala błąd

Exception Details: System.Data.SqlClient.SqlException: The variable name '@title' has already been declared. Variable names must be unique within a query batch or stored procedure.

Co mogę zrobić aby te parametry były unikatowe? Jak rozwiązać ten problemik aby kod pozwalał na zrobienie więcej niż jednego insertu do BD ?

0

Dodaj na początku (zaraz po foreach) cmd.Parameters.Clear()

pozdrawiaMM

0

Wielkie dzięki

0

Albo (dopiero teraz po dokładnym wczytaniu się zauważyłem) możesz przed pętlą dodać parametry (z wartościami nawet), a w samej pętli tylko ZMIENIAĆ wartość parametru @sendTo. Tak będzie szybciej i ładniej :)

pozdrawiaMM

0
using(SqlConnection conn = new SqlConnection(_connectionParameters))
{
   conn.Open();

   SqlCommand cmd = new SqlCommand(
      "INSERT Messagess (title, text, autor, sendTo, date, typeOfMessages)" +
      "VALUES (@title, @text, @autor, @sendTo, @date, @typeOfMessages)", conn);
   cmd.Parameters.AddWithValue("@title", newMessage.Title);
   cmd.Parameters.AddWithValue("@text", newMessage.Text);
   cmd.Parameters.AddWithValue("@autor", newMessage.Autor);
   cmd.Parameters.AddWithValue("@date", newMessage.Date);
   cmd.Parameters.AddWithValue("@typeOfMessages", newMessage.TypeOfMessages);

   cmd.Parameters.Add("@sendTo");
   foreach (string send in sendTo)
   {
      cmd.Parameters["@sendTo"] = send;
      cmd.ExecuteNonQuery();
   }
}
0

Zmieniłem trochę kod i działa. Dzięki jeszcze raz!

zmieniłem na

               foreach (string send in sendTo)
                {
                    cmd.Parameters.AddWithValue("@sendTo", send);
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.RemoveAt("@sendTo");
                }

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