【问题标题】:{"Incorrect syntax near 'C'."}.....Error Debug{“'C'附近的语法不正确。”}.....错误调试
【发布时间】:2011-06-07 05:57:46
【问题描述】:
SqlConnection conn = new SqlConnection("Server=ILLUMINATI;" + 
    "Database=DB;Integrated Security= true");
SqlCommand comm = new SqlCommand(
    "Insert into FileUpload ('FilePath','TypeId','UploadedBy','UploadedDate') 
    values (" + savePath + "," + typeid + "," + NAME + "," + DateTime.Now+ ")", conn);

conn.Open();
comm.ExecuteNonQuery();
conn.Close();

它给出了一个错误提示:

{"'C' 附近的语法不正确。"}

谁能告诉我错误。

【问题讨论】:

    标签: c# asp.net sql-server insert


    【解决方案1】:

    您必须在值字符串周围加上单个 '' 引号,而不是在列名周围

    试试这个

    SqlCommand comm = new SqlCommand(
        "Insert into FileUpload (FilePath,TypeId,UploadedBy,UploadedDate) 
        values ('" + savePath + "','" + typeid + "','" + NAME + "',"
    

    假设typeID 是字符串,如果不是,不要在它周围加上''

    【讨论】:

    • @ILLUMINATI7590:请注意,此代码仍然容易受到 SQL 注入攻击。你真的应该使用参数化查询。
    【解决方案2】:

    它给出错误的原因正如哈里斯所说 - 你把单引号放在错误的地方。

    但是,仅通过将引号放在不同的位置来“解决”此问题是一个非常糟糕的主意。相反,您应该使用参数化查询:

    SqlCommand comm = new SqlCommand
        ("Insert into FileUpload (FilePath, TypeId, UploadedBy, UploadedDate)" +
         " values (@savePath, @typeid, @name, @now)", conn);
    comm.Parameters.AddWithValue("@savePath", savePath);
    comm.Parameters.AddWithValue("@typeid", typeid);
    comm.Parameters.AddWithValue("@name", NAME);
    comm.Parameters.AddWithValue("@now", DateTime.Now);
    

    通过将您的数据表示为数据,而不是作为“代码”(SQL)的一部分,您可以避免担心转换(例如日期格式)并且您避免 SQL 注入攻击。

    有关更多详细信息,请参阅SqlCommand.Parameters 文档(或搜索“参数化查询”)。

    【讨论】:

    • 在SqlCommand 中使用parameters.AddWithValue 是否可以阻止SQL 注入攻击?我看不懂..
    • @Soner:不仅仅是 AddWithValue - 基本上将所有数据表示为参数(无论如何填充它们)而不是在 SQL 中是避免 SQL 注入攻击的最佳方法。它避免了数据(很可能来自用户)被视为 SQL。
    • 很高兴知道。但是为了清楚地理解,你能举一个例子来说明这种情况。例如,在问题的代码中,用户如何获得 SQL 注入?据我了解,我们在插入、删除等处理时应该使用 Parameters 值对吗?
    • @Soner:想象一下,如果用户键入了一个包含引号、括号等的 savePath。他们基本上可以为其余数据提供自己的参数,从而破坏了初衷。简而言之,您应该在 SQL 查询中为 all 非硬编码数据使用参数。 (在许多情况下,我个人也会将它们用于硬编码数据,以保持一致性……尤其是在涉及日期的情况下,因为它们可能会导致转换困难。)
    【解决方案3】:

    将具有 varchar 和 datetime 类型的列括在单引号中。

    SqlCommand comm = new SqlCommand(
        "Insert into FileUpload ('FilePath','TypeId','UploadedBy','UploadedDate') 
        values ('" + savePath + "'," + typeid + ",'" + NAME + "','" + DateTime.Now+ "')", 
        conn);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多