Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# {';C';}附近的语法不正确..调试错误_C#_Asp.net_Sql Server_Insert - Fatal编程技术网

C# {';C';}附近的语法不正确..调试错误

C# {';C';}附近的语法不正确..调试错误,c#,asp.net,sql-server,insert,C#,Asp.net,Sql Server,Insert,它给出了一个错误,说: {“C”附近的语法不正确。} 有人能告诉我错误吗。您必须在值字符串周围而不是列名周围加上单引号 试试这个 SqlConnection conn = new SqlConnection("Server=ILLUMINATI;" + "Database=DB;Integrated Security= true"); SqlCommand comm = new SqlCommand( "Insert into FileUpload ('FilePath','T

它给出了一个错误,说:

{“C”附近的语法不正确。}


有人能告诉我错误吗。

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

试试这个

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();

假设
typeID
是字符串,如果不是,请不要在其周围放置
'

将具有varchar和datetime类型的列括在一个引号中

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

它产生错误的原因正如Haris所说——你把单引号放错地方了

然而,仅仅通过将引用放在不同的地方来“修复”这一问题是一个非常糟糕的想法。相反,您应该使用参数化查询:

SqlCommand comm = new SqlCommand(
    "Insert into FileUpload ('FilePath','TypeId','UploadedBy','UploadedDate') 
    values ('" + savePath + "'," + typeid + ",'" + NAME + "','" + DateTime.Now+ "')", 
    conn);
通过将数据表示为数据,而不是作为“代码”(SQL)的一部分,您可以避免担心转换(例如日期格式),并且可以避免SQL注入攻击


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

在SqlCommand中使用parameters.AddWithValue可以阻止SQL注入攻击吗?我不明白。@Soner:不仅仅是AddWithValue——基本上,将所有数据表示为参数(无论如何填充),而不是在SQL中,这是避免SQL注入攻击的最佳方法。它避免了数据(可能来自用户)被视为SQL。很高兴知道。但是为了清楚地理解,你能举个例子说明这种情况吗。例如,在问题的代码中,用户如何获得SQL注入?据我所知,当我们插入、删除等时,我们应该使用参数值。处理对吗?@Soner:想象一下,如果用户键入一个包含引号、括号等的保存路径,他们基本上可以为其余数据提供自己的参数,破坏了原始意图。简单地说,您应该为SQL查询中的所有非硬编码数据使用参数。(我个人在很多情况下也会将它们用于硬编码数据,以确保一致性……特别是在涉及日期的情况下,因为它们可能会导致转换的痛苦。)@7590:注意,此代码仍然容易受到SQL注入攻击。您确实应该使用参数化查询。
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);