使用参数插入SQL会导致"语法不正确靠近关键字'值'"

时间:2015-04-21 11:30:39

标签: c# sql sql-server ado.net

我想用mssql中的表填充用户输入的值(错误来自NumericUpDown),并且我使用此代码填写:

 string cs= "Data Source=CODRINMA\\CODRINMA;Initial Catalog=BusManager; Trusted_Connection=True;";
 string insert = "INSERT INTO TipAutocar ([IDTipAutocar], [Marca], [Model], [Nrlocuri] values ([@TipAutocar], [@Marca], [@Model], [@Nrlocuri]))";
try
{
    using (SqlConnection con = new SqlConnection(cs))
    {
        con.Open();

        SqlCommand cmd = new SqlCommand(insert, con);

        cmd.Parameters.AddWithValue("@IDTipAutocar", txtID.Text);
        cmd.Parameters.AddWithValue("@Marca", txtMarca.Text);
        cmd.Parameters.AddWithValue("@Model", txtModel.Text);
         cmd.Parameters.AddWithValue("@Nrlocuri", nmrLocuri.Value);
        int valoare = cmd.ExecuteNonQuery();
        con.Close();
        MessageBox.Show(valoare + "Tipul de autocar a fost adaugat cu succes!", "BusManager");

    }
}
catch (Exception er) { MessageBox.Show(er.Message); }

但是,当我按下按钮进行插入时,我发现了以下错误,我无法弄清楚要做什么:

  

关键字'值'附近的Incorect语法。

2 个答案:

答案 0 :(得分:1)

我在values之前错过了一个结束圆括号:

string insert = "INSERT INTO TipAutocar ([IDTipAutocar], [Marca], [Model], [Nrlocuri] values ([@IDTipAutocar], [@Marca], [@Model], [@Nrlocuri]))";

您不允许在参数周围使用[],否则它不是参数,您将收到错误f.e. “无效的列名[@TipAutocar]”。

您还可以为参数@TipAutocar命名,但请将其添加为IDTipAutocar。 此外,如果使用AddWithValue从值中推断出类型,请始终使用正确的类型。所以我想IDTipAutocarint,然后在之前将其解析为:

cmd.Parameters.AddWithValue("@IDTipAutocar", int.Parse(txtID.Text));

顺便说一句,我总是使用逐字字符串文字。在那种方式,我可以按我想要格式化我的SQL查询,即使有多行。这应该像检测到的那样工作:

string insert = @"INSERT INTO TipAutocar
                     ( IDTipAutocar, Marca, Model, Nrlocuri )
                  VALUES 
                     ( @IDTipAutocar, @Marca, @Model, @Nrlocuri)";

答案 1 :(得分:1)

看看这个括号;

string insert = "INSERT INTO TipAutocar ([IDTipAutocar], [Marca], [Model], [Nrlocuri] values (@TipAutocar, [@Marca, @Model, @Nrlocuri))";
                                       ^^^

您在查询结束时关闭它,您应该在VALUES部分之前关闭它。

将其更改为;

string insert = "INSERT INTO TipAutocar ([IDTipAutocar], [Marca], [Model], [Nrlocuri]) values (@TipAutocar, @Marca, @Model, @Nrlocuri)";
                                        ^^^                                         ^^^

顺便说一下,不需要不允许使用方括号作为参数。同时使用using语句来处理您的SqlCommand。由于您对SqlConnection使用了此声明,因此您无需使用con.Close()将其关闭,因为此声明会自动执行此操作。

您还可以在命令中将参数名称定义为@TipAutocar,但尝试将参数名称添加为@IDTipAutocar,但不匹配。更改您的参数名称,如;

cmd.Parameters.AddWithValue("@TipAutocar", txtID.Text);

不再使用AddWithValue了。 It may generate unexpected results。请使用.Add()方法重载来指定SqlDbType和参数大小。