SQL异常'G'附近的语法不正确是什么问题?

时间:2019-03-22 15:14:12

标签: c# sql visual-studio-2017

我有一个通过插入C#中的值创建的SQL查询。

在C#中:

string command = "INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL) 
                  VALUES (" + model + ", " + batterylife + ", " + price + ", " + antutu + ", " + imgURL + " )";

在解析后的SQL中:

INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL) 
VALUES ( Samsung-Galaxy-S10-5G, 0, 0, 0, 
         cdn2.gsmarena.com/vv/bigpic/samsung-galaxy-s10-5g.jpg )

,并在尝试执行它时,Visual Studio引发以下异常:

  

System.Data.SqlClient.SqlException
  HResult = 0x80131904
  Message ='G'附近的语法不正确。
  Source = .Net SqlClient数据提供程序

此外,当我用单词替换常规模型名称变量时,Visual Studio会为小g抛出相同的异常,而没有位置帮助来理解。

1 个答案:

答案 0 :(得分:0)

正如其他人所指出的,您正在使用字符串串联来构建SQL命令,这将在代码中启用SQL注入。

请改用以下模式,该模式依赖于参数,因此不受此攻击的影响:

using System.Data.SqlClient;
using System.Data;
...
using (var cn = new SqlConnection("YourConnectionString"))
{
    cn.Open();

    using (var cm = cn.CreateCommand())
    {
        cm.CommandType = System.Data.CommandType.Text;
        cm.CommandText =
            "INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL) " +
            "VALUES (@devicename, @batterylife, @price, @antutu, @ImageURL)";

        cm.Parameters.Add("@devicename", SqlDbType.VarChar, 50).Value = "Samsung-Galaxy-S10-5G";
        cm.Parameters.Add("@batterylife", SqlDbType.Int).Value = 0;
        cm.Parameters.Add("@price", SqlDbType.Int).Value = 0;
        cm.Parameters.Add("@antutu", SqlDbType.Int).Value = 0;
        cm.Parameters.Add("@ImageURL", SqlDbType.VarChar, -1).Value = "cdn2.gsmarena.com/vv/bigpic/samsung-galaxy-s10-5g.jpg";

        cm.ExecuteNonQuery();
    }
}

您必须根据需要调整每个SqlParameter的大小/类型。