#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]);
Возможная альтернатива: Параметры с табличным значением.