Считайте значение из базы данных и сохраните его в переменной - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу получить доступ к своей базе данных SQL Server и получить значение некоторых столбцов с определенным идентификатором.Я получаю идентификатор для печати базы данных в таблице dataGridView, поэтому первая ячейка строки, которую выбрал пользователь, - это идентификатор.Вот код

con3.Open();

if (typeBOX.SelectedIndex == 0)
{
    pictureBox1.Image = Organizer.Properties.Resources.b_height_years;
    ChartForm.ImageSet = 1;
    pictureBox1.Invalidate();

    SqlCommand cmd1 = new SqlCommand("select Height,Age from data where Id = '" + dataGridView1.SelectedCells[0].Value.ToString() + "'", con3);
    // SqlCommand cmd2 = new SqlCommand("select Age from data where Id = '" + dataGridView1.SelectedCells[0].Value.ToString() + "'", con3);

    SqlDataReader reader1 = cmd1.ExecuteReader();
    bool flag = false;

    while (reader1.Read() && flag == false)
    {
        string tempHeight = reader1["Height"].ToString();
        ChartForm.Height = int.Parse(tempHeight);
        string tempAge = reader1["Age"].ToString();
        ChartForm.Age = int.Parse(tempAge);
        flag = true;
    }
}

Но когда я пытаюсь запустить код, я получаю сообщение об ошибке:

System.Data.SqlClient.SqlException: 'Преобразование не удалось при преобразованииЗначение varchar 'zxxv' для типа данных int.

'zxxv' является сохраненным FirstName в базе данных, но я не делаю этого в моей команде cmd1.Я только получаю доступ к height и age, которые оба являются целыми числами.Я не знаю, почему это происходит.

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Бьюсь об заклад, вы получили эту ошибку, потому что вы пытались извлечь идентификатор из неправильной ячейки в данных.В сообщении об ошибке указывается, что произошла ошибка при попытке преобразовать значение 'zxxv' в int.Это будет означать, что значение, хранящееся в:

dataGridView1.SelectedCells[0]

, равно 'zxxv'.Произошла ошибка, когда SQL Server пытается сравнить это значение со столбцом int.Похоже, вы щелкнули ячейку в dataGridView1, которая содержала имя, но идентификатор находится в другом столбце или скрыт.Это просто дикая догадка, но это лучшее, что я могу сделать, не имея остального кода.Может ли что-то подобное исправить?

dataGridView1.SelectedRows[0].Cells[0].Value

или:

dataGridView1.SelectedRows[0].Cells["Id"].Value

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

1 голос
/ 27 сентября 2019

Проблема в том, что вы передаете 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 документам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...