为什么我在 "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 注入被阻止,您不必考虑数据库类型。这不太正确,因为我假设所有数据库字段都是字符串,这是极不可能的,但您没有另外指定。不是字符串的字段,在设置参数值之前,您必须转换为正确的类型。

在现实生活中,您会将所有数据库内容放在数据层中,只在此处处理用户界面,但我将其留给您自己解决。

另外你不应该捕获异常,而是可能发生的异常子类型。