Как редактировать данные в результатах поиска на языке C#
I managed to create a code for my edit button and search button. My edit button is functional. It can edit my data in database, my search code is also functional. My problem is to edit data in search results. Like if i search "naruto", my datagridview will filter all the names that has "naruto" on the database. After i choose and doubleclick on the result, all data will reappear to my textbox. But when i edit that data, it doesn't work. Instead, the first data on my database is the one that is changing not the one that i choose. My edit code is working if i don't search any names and don't choose on the search result. I think the problem is in my Edit codes. Please share your answers. Much better if you have a code examples. THANKS IN ADVANCE!
вот мои коды. пожалуйста помочь...
Что я уже пробовал:
private void JOGridView_DoubleClick(object sender, EventArgs e) { DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter("Select * from JobOrder", con); if (JOGridView.CurrentCell != null && JOGridView.CurrentCell.Value != null) { TBName.Text = JOGridView.SelectedRows[0].Cells[0].Value.ToString(); TBContact.Text = JOGridView.SelectedRows[0].Cells[1].Value.ToString(); CBStatus.Text = JOGridView.SelectedRows[0].Cells[2].Value.ToString(); TBModel.Text = JOGridView.SelectedRows[0].Cells[3].Value.ToString(); TBSerial.Text = JOGridView.SelectedRows[0].Cells[4].Value.ToString(); TBAccess.Text = JOGridView.SelectedRows[0].Cells[5].Value.ToString(); TBRB.Text = JOGridView.SelectedRows[0].Cells[6].Value.ToString(); TBRP.Text = JOGridView.SelectedRows[0].Cells[8].Value.ToString(); TBIT.Text = JOGridView.SelectedRows[0].Cells[10].Value.ToString(); CBRamarks.Text = JOGridView.SelectedRows[0].Cells[11].Value.ToString(); TBCharge.Text = JOGridView.SelectedRows[0].Cells[12].Value.ToString(); TBRELB.Text = JOGridView.SelectedRows[0].Cells[13].Value.ToString(); } } private void BTNEdit_Click(object sender, EventArgs e) { { DialogResult dr; dr = MessageBox.Show("Are you sure you want to Edit this record?", "Update Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dr == DialogResult.Yes) { DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM JobOrder", con); da.Fill(dt); dt.Rows[JOGridView.CurrentRow.Index].BeginEdit(); dt.Rows[JOGridView.CurrentRow.Index][1] = TBName.Text; dt.Rows[JOGridView.CurrentRow.Index][2] = TBContact.Text; dt.Rows[JOGridView.CurrentRow.Index][3] = CBStatus.Text; dt.Rows[JOGridView.CurrentRow.Index][4] = TBModel.Text; dt.Rows[JOGridView.CurrentRow.Index][5] = TBSerial.Text; dt.Rows[JOGridView.CurrentRow.Index][6] = TBAccess.Text; dt.Rows[JOGridView.CurrentRow.Index][7] = TBRB.Text; dt.Rows[JOGridView.CurrentRow.Index][8] = DTDR.Text; dt.Rows[JOGridView.CurrentRow.Index][9] = TBRP.Text; dt.Rows[JOGridView.CurrentRow.Index][10] = DTDF.Text; dt.Rows[JOGridView.CurrentRow.Index][11] = TBIT.Text; dt.Rows[JOGridView.CurrentRow.Index][12] = CBRamarks.Text; dt.Rows[JOGridView.CurrentRow.Index][13] = TBCharge.Text; dt.Rows[JOGridView.CurrentRow.Index][14] = TBRELB.Text; dt.Rows[JOGridView.CurrentRow.Index][15] = DTDR.Text; dt.Rows[JOGridView.CurrentRow.Index].EndEdit(); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.Update(dt); displayrecords(); MessageBox.Show("Selected record has been Updated!", "Done Updating ", MessageBoxButtons.OK, MessageBoxIcon.Information); } clearrecords(); } } private void TBSearch_KeyUp(object sender, KeyEventArgs e) { if (TBSearch.Text == " ") { } else con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "Select * from JobOrder where Name like ('" + TBSearch.Text + "%')"; cmd.ExecuteNonQuery(); DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); JOGridView.DataSource = dt; con.Close(); }
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
private void TBSearch_KeyUp(object sender, KeyEventArgs e) { using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "SELECT * FROM JobOrder WHERE Name Like @Search + '%'"; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@Search", TBSearch.Text); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); JOGridView.DataSource = dt; } }
Azzyloth
Тот же результат и с моими кодами. вместо того чтобы редактировать тот, который я выбираю в результате поиска, первые данные из моей базы данных-это тот, который меняется :(
Richard Deeming
Потому что ваша функция "редактировать" загружается все данные, а не данные, отображаемые в таблице.
Вероятно, вам придется использовать первичный ключ таблицы, чтобы обновить только ту запись, которую вы редактируете.
Azzyloth
у меня нет проблем с редактированием, когда все данные находятся в моем datagridview. только в результате поиска. не могли бы вы дать мне пример кода для моей кнопки редактирования? или, может быть, просто пересмотрите его, если он вас устраивает и если вы не заняты.
Richard Deeming
Что такое первичный ключ для JobOrder
стол?
Azzyloth
ИДЕНТИФИКАТОР. Я не включил этот идентификатор в свой набор данных, но когда я добавляю новые данные, идентификатор в моей базе данных обновляется. Приращение 1
Azzyloth
Вы создали класс по вашим кодам? я получил сообщение об ошибке: "имя класса '?' не является допустимым идентификатором для этого языка. "
Richard Deeming
Методы в моем ответе относятся к тому же классу, что и методы в вашем вопросе.
Richard Deeming
Какая проблема?
Azzyloth
Необработанное исключение типа "System.Data.SqlClient.SqlException" произошло в System.Data.dll
Дополнительная информация: неверный синтаксис рядом с ключевым словом "WHERE".
Это моя проблема
Мое имя первичного ключа - "ID", и оно находится в первом столбце моей базы данных. когда он пытается поместить dataset в мой datagridview, я всегда удаляю идентификатор. вот почему первый столбец в моем datagridview-это имя, а не идентификатор.
Azzyloth
Теперь он работает. Просто здесь ваш код
ГДЕ
ID = @ID
;";
там есть ";" на нем. Хахаха
БОЛЬШОЕ СПАСИБО, ПРИЯТЕЛЬ!