为什么我在 "Letter" 附近得到不正确的语法?
Why I'm getting incorrect syntax near "Letter"?
我正在尝试向系统添加新车详细信息。我想添加 CarId 的 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 文本框输入值时,
发生异常:“无效的列名”,“字母”附近的语法不正确enter image description here
我将尝试修复您的代码,希望它能解决您的问题,或者至少让您更清楚地知道出了什么问题。这是新代码:
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 模式中,因此它将自动关闭和释放。 Sql命令也是如此。
查询正在使用参数,因此 Sql 注入被阻止,您不必考虑数据库类型。这不太正确,因为我假设所有数据库字段都是字符串,这是极不可能的,但您没有另外指定。不是字符串的字段,在设置参数值之前,您必须转换为正确的类型。
在现实生活中,您会将所有数据库内容放在数据层中,只在此处处理用户界面,但我将其留给您自己解决。
另外你不应该捕获异常,而是可能发生的异常子类型。
我正在尝试向系统添加新车详细信息。我想添加 CarId 的 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 文本框输入值时, 发生异常:“无效的列名”,“字母”附近的语法不正确enter image description here
我将尝试修复您的代码,希望它能解决您的问题,或者至少让您更清楚地知道出了什么问题。这是新代码:
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 模式中,因此它将自动关闭和释放。 Sql命令也是如此。
查询正在使用参数,因此 Sql 注入被阻止,您不必考虑数据库类型。这不太正确,因为我假设所有数据库字段都是字符串,这是极不可能的,但您没有另外指定。不是字符串的字段,在设置参数值之前,您必须转换为正确的类型。
在现实生活中,您会将所有数据库内容放在数据层中,只在此处处理用户界面,但我将其留给您自己解决。
另外你不应该捕获异常,而是可能发生的异常子类型。