繁体   English   中英

'G' 附近的 SQL 异常语法错误是什么问题?

[英]SQL exception incorrect syntax near 'G' what's the problem?

我有一个通过从 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 抛出相同的异常。

正如其他人所指出的,您正在使用字符串连接来构建您的 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的大小/类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM