我想访问我的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
中不赞成这样做。我只访问都是整数的height
和age
。我不知道为什么会这样。
答案 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作为参数传递。您也应该这样做。但是我不认为缺少参数是导致错误的原因。