Проблема в том, что вы передаете Id
как строку, а не как int.Итак, ошибка говорит вам, что SQL-серверу не удалось преобразовать строку в int.Причина этого заключается в том, что Id
заключен в одинарные кавычки, которые SQL будет интерпретировать как строку (varchar/nvarchar
).
Я бы рекомендовал всегда параметризировать ваш запрос SQL, чтобы избежать потенциальных атак черезSQL-инъекция и подобные проблемы.Пожалуйста, смотрите Почему мы всегда предпочитаем использовать параметры в инструкциях SQL? .
Вам также нужно убедиться, что вы выбираете правильное значение из dataGridView
, как @RussW упоминает в своем ответе.Вы выбираете поле FirstName
, поэтому, возможно, вы могли бы использовать:
int selectedRowIndex = datagridview1.SelectedCells[0].RowIndex;
DataGridViewRow selectedRow = datagridview1.Rows[selectedRowIndex ];
int id = int.Parse(selectedRow.Cells["Id"].Value.To);
или
int rowIndex = dataGridView1.CurrentCell.RowIndex;
int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
int id = int.Parse(dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString());
Ниже приведен пример, с которого следует начать:
string query = "select Height, Age from data where Id = @id"; // parameter @id in string
SqlCommand cmd1 = new SqlCommand(query, con3); // create command with string
// get the correct row and cell
int selectedRowIndex = dataGridView1.SelectedCells[0].RowIndex;
DataGridViewRow selectedRow = dataGridView1.Rows[selectedRowIndex];
int id = int.Parse(selectedRow.Cells["Id"].Value.ToString()); // parse id to int
// create sql parameter and add to SqlCommand
SqlParameter param1 = new SqlParameter("@id", id);
cmd1.Parameters.Add(param1);
// continue your code...
SqlDataReader reader1 = cmd1.ExecuteReader();
....
Обратите внимание, что при использовании параметризованных запросов нет необходимости заключать параметр в кавычки, он обрабатывается для вас.Пожалуйста, обратитесь к SqlCommand.Parameters документам.