как обновить множество целочисленных значений обратно в соответствующие столбцы базы данных на языке Си#

#c#

Вопрос:

у меня есть сетка данных, которая загружает информацию из базы данных, и когда каждая строка выбрана таким образом, все столбцы отображаются в одном текстовом поле 1, как это;

 private void dgvGrade_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    DataRowView dr = dg.SelectedItem as DataRowView;
    if (dr != null)
    {
        
        if (dgvGrade.SelectedItems.Count > 0)
        {
            foreach (var obj in dgvGrade.SelectedItems)
            {
                //txtids.Text  = dr["IDNO"].ToString();
                str  = dr["ENGLISH"]   "   "   dr["MATH"]   "    "   dr["SOCIAL"]   "   "   dr["SCIENCE"]   "   "   dr["PRETECH"]   "   "   dr["ICT"]   "   "   dr["RME"]   "  "   dr["HOMEECOMICS"]   "  "   dr["HISTORY"]   "   "   dr["OWOP"]   "   "   dr["CREATIVEART"]   "   "   dr["FRENCH"]   "   "   dr["LANGUAGE"]   " "   " ";
            }
        }
        else
        {
            //DO NOTHING
        }
        txtresults.Text = str;
    }
 

и после изменения каждой цифры в текстовом поле 1 я хотел бы сохранить каждое значение обратно в базу данных в каждом столбце, поэтому я попробовал это;

 SqlConnection Conn = new SqlConnection(shoolmanangmentconn);
    DataTable dt = new DataTable();
    Conn.Open();
    SqlCommand cmd = new SqlCommand("UPDATE tbl_TestingTheApplicationSubject SET MATH=@MATH, ENGLISH=@ENGLISH, SOCIAL=@SOCIAL, SCIENCE=@SCIENCE, RME=@RME, PRETECH=@PRETECH, HOMEECOMICS=@HOMEECOMICS,  HISTORY=@HISTORY, OWOP=@OWOP, ICT=@ICT, FRENCH=@FRENCH, CREATIVEART=@CREATIVEART, LANGUAGE=@LANGUAGE WHERE IDNO IN (@IDNO)", Conn);
    cmd.CommandType = CommandType.Text;
    string[] arryval = txtresults.Text.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
    int i = 0;
    String IDNO = "123,567,89";
    cmd.Parameters.Clear();
    **cmd.Parameters.AddWithValue("@IDNO",IDNO)**; // TODO: use correct value of IDNO
    cmd.Parameters.AddWithValue("@ENGLISH", arryval[i  ]);
    cmd.Parameters.AddWithValue("@MATH", arryval[i  ]);
    cmd.Parameters.AddWithValue("@SOCIAL", arryval[i  ]);
    cmd.Parameters.AddWithValue("@SCIENCE", arryval[i  ]);
    cmd.Parameters.AddWithValue("@PRETECH", arryval[i  ]);
    cmd.Parameters.AddWithValue("@ICT", arryval[i  ]);
    cmd.Parameters.AddWithValue("@RME", arryval[i  ]);
    cmd.Parameters.AddWithValue("@HOMEECOMICS", arryval[i  ]);
    cmd.Parameters.AddWithValue("@HISTORY", arryval[i  ]);
    cmd.Parameters.AddWithValue("@OWOP", arryval[i  ]);
    cmd.Parameters.AddWithValue("@CREATIVEART", arryval[i  ]);
    cmd.Parameters.AddWithValue("@FRENCH", arryval[i  ]);
    cmd.Parameters.AddWithValue("@LANGUAGE", arryval[i  ]);
    cmd.ExecuteNonQuery();
 

но в итоге я сохраняю только одну строку в ее столбцах IDNO, но у меня также выбрано много столбцов IDNO, но я не знаю, как сохранить каждую строку обратно в соответствии с номерами IDNO, пожалуйста, может ли кто-нибудь помочь мне, пожалуйста (я использую c# wpf)

Ответ №1:

Ваша проблема заключается в этой части вашего SQL-запроса IDNO=@IDNO . При использовании = оператора для сравнения может быть предоставлено только одно конкретное значение. Поскольку вы хотите обновить несколько записей, вместо этого вам следует использовать IN оператор IDNO IN (@IDNO) следующим образом . Затем вам нужно будет создать разделенный запятыми список идентификаторов в виде строки, для @IDNO которой вы можете добавить в качестве параметра. Например, @IDNO должно выглядеть примерно так "123, 723, 987" (с фактическими идентификаторами ваших данных), прежде чем вы добавите его в параметры своей команды.

Комментарии:

1. это не сработало для меня, пожалуйста, не могли бы вы предложить мне другой вариант, пожалуйста

2. @KcisraelKicsoAcquah Не могли бы вы, пожалуйста, обновить свой пост новым кодом, который вы пробовали, а также значением @IDNO ?

3. пожалуйста, сэр, я только что обновил код, как и в вашем предыдущем предложении, но я считаю, что кое-где ошибаюсь, пожалуйста, сэр, я здесь новичок, вы можете мне очень помочь, пожалуйста.

4. @KcisraelKicsoAcquah Да, я хотел бы помочь, я просто не уверен в вашей проблеме с новым кодом. Не могли бы вы, пожалуйста, показать мне, в чем заключается ценность @IDNO ?

5. хорошо, чтобы быть ясным; значение @IDNO загружается в другое текстовое поле одновременно при выборе каждой строки из сетки данных; у меня есть

Ответ №2:

У вас есть строка IDNO со значением "123,567,89" , и вы хотите использовать ее в sql — запросе, например ... WHERE IDNO IN (@IDNO) , чтобы получить ... WHERE IDNO IN (123,567,89) .

Извините, вы не можете этого сделать. Параметр может содержать только одно значение, и он не будет расширен до списка значений для использования в предложении IN. Насколько известно SQLServer, это всего лишь одно (n)значение varchar, а не список int.

Однако вы можете создать серию заполнителей, чтобы фрагмент командной строки выглядел так ... WHERE IDNO IN (@p0, @p1, @p2) (по одному @p<n> для каждого значения в переменной IDNO.

  • Сначала разделите значение IDNO, используя
 string[] stringvals = IDNO.Split(",");
 
  • Затем создайте заполнители и добавьте их в свой запрос
 var placeholders = string.Join(", ", Enumerable.Range(0, stringvals.Length).Select(n => $"@p{n}"));
var sql = $"UPDATE tbl_TestingTheApplicationSubject SET ... WHERE IDNO IN ({placeholders})";
 
  • Создайте sqlпараметры для каждого, указав соответствующее значение из stringvals, преобразованное в int.
     cmd.Parameters.Add($"@p{n}", SqlDbType.Int).Value = Convert.ToInt32(stringvals[n]);
 

Возможная альтернатива: Параметры с табличным значением.