为什么我在"Letter"附近得到不正确的语法?



我正在尝试向系统添加新的汽车详细信息。我想添加到id的varchar值。在数据库中,carId的类型为varchar。

这是我的代码:

private void btnAddCar_Click(object sender, EventArgs e){
if (txtCarId.Text == "" || txtModel.Text == "" || txtColor.Text == "" || txtFuelType.Text == "" || txtPrice.Text == "")
{
MessageBox.Show("Missing Information");
}
else
{
try
{
Con.Open();
string query = "insert into CAR(CarID,Model,Color,FuelType,Available,Price) values(" + txtCarId.Text + ",'" + txtModel.Text + "','" + txtColor.Text + "','"+txtFuelType.Text + "','"+cmbBoxAvailable.SelectedItem.ToString()+"',"+txtPrice.Text+")";
SqlCommand cmd = new SqlCommand(query, Con);
cmd.ExecuteNonQuery();
MessageBox.Show("Car Successfully Added");
Con.Close();
populate();
}
catch (Exception myEx)
{
MessageBox.Show(myEx.Message);
}
}
}

但是当我向CarId文本框输入值时,出现异常:"无效的列名";在这里输入图片描述

我将尝试修复您的代码,并希望它能解决您的问题,或者至少使出错的地方更清楚。下面是新的代码:

private void btnAddCar_Click(object sender, EventArgs e)
{
if (txtCarId.Text == "" || txtModel.Text == "" || txtColor.Text == "" || txtFuelType.Text == "" || txtPrice.Text == "")
{
MessageBox.Show("Missing Information");
}
else
{
try
{
using (var con = new SqlConnection(<your connectionstring goes here>)
{
con.Open();
string query = "INSERT INTO CAR(CarID,Model,Color,FuelType,Available,Price) VALUES(@CarID,@Model,@Color,@FuelType,@Available,@Price)";
using (var cmd = new SqlCommand(query, con))
{
cmd.Parameters.Add("@CarID").Value = txtModel.Text;
cmd.Parameters.Add("@Model").Value = txtModel.Text;
cmd.Parameters.Add("@Color").Value = txtColor.Text;
cmd.Parameters.Add("@FuelType").Value = txtFuelType.Text;
cmd.Parameters.Add("@Available").Value = cmbBoxAvailable.SelectedItem.ToString();
cmd.Parameters.Add("@Price").Value = txtPrice.Text;
cmd.ExecuteNonQuery();
MessageBox.Show("Car Successfully Added");
}
populate();
}
}
catch (Exception myEx)
{
MessageBox.Show(myEx.Message);
}
}
}

因此,SqlConnection现在是本地的,并包装在using模式中,因此它将被自动关闭和处理。对于SqlCommand也是如此。

查询使用参数,因此Sql注入被阻止,您不必考虑数据库类型。这并不完全正确,因为我假设所有数据库字段都是字符串,这是非常不可能的,但您没有指定其他方式。如果字段不是字符串,则必须在设置参数值之前将其转换为正确的类型。

在现实生活中,你会把所有数据库的东西放在数据层,只处理用户界面,但我把这个留给你自己去解决。

也不应该捕获Exception,而应该捕获可能发生的Exception子类型。

相关内容

  • 没有找到相关文章

最新更新