从数据库中读取一个值并将其保存到变量中

时间:2019-09-27 18:01:12

标签: c# sql-server

我想访问我的SQL Server数据库并检索具有特定ID的某些列的值。我得到的id作为dataGridView表中数据库的打印件,因此用户选择的行的第一个单元格是id。这是代码

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中不赞成这样做。我只访问都是整数的heightage。我不知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

问题是您将Id作为字符串而不是int传递。因此,错误告诉您SQL Server无法将字符串转换为int。发生这种情况的原因是因为Id用单引号引起来,SQL会将其解释为字符串(varchar/nvarchar)。

我建议始终对您的SQL查询进行参数设置,以避免通过SQL注入和此类问题引起潜在的攻击。请参阅Why do we always prefer using parameters in SQL statements?

您还需要确保从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文档。

答案 1 :(得分:1)

我敢打赌,您收到了该错误,因为您试图将ID从数据中的错误单元格中拉出。错误消息指出尝试将值“ zxxv”转换为int时发生错误。这意味着该值存储在:

dataGridView1.SelectedCells[0]

是'zxxv'。当SQL Server尝试将该值与int列进行比较时,发生错误。看起来您可能单击了dataGridView1中包含名字的单元格,但是id在不同的列中或被隐藏了。这只是一个疯狂的猜测,但这是我在没有其余代码的情况下可以做的最好的事情。这样的东西可以解决吗?

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

或:

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

我完全同意其他人所说的,您应该将id作为参数传递。您也应该这样做。但是我不认为缺少参数是导致错误的原因。