我有一个SqlCommand尝试在SQL Server数据库表中插入一行。感兴趣的列是nvarchar(100),需要输入的数据将包括诸如“ - ”,“;”之类的字符。和“\”。当我插入没有这些字符的字符串时,一切正常。当我尝试插入包含这些字符的字符串时,代码会失败,因为代码会逐字理解这些字符,从而报告语法错误。我已经使用动态sql单独在TSQL中解决了这个问题,但我找不到任何好的引用来在C#中执行此操作。我想我可以创建一个存储过程并传递值,但有没有一种方法可以使用C#单独有效地执行此操作?如果是这样,怎么样?或者将值传递给存储过程是一种更好的方法吗?
以下是代码的简化版本:
String SQLServerInstanceNames = "ussqlclus-db43\ussqlclusdb43; ussqlclus-db44\ussqltrysdb44; ussqltrys-db45\ussqltrysdb45;"
//Create Connection (Get Connection string from Server Explorer)
SqlConnection myConnection = new SqlConnection("Data Source=SERVER1;Initial Catalog=Database1;Integrated Security=True");
//Open connection
try { myConnection.Open(); }
catch (Exception e) { Console.WriteLine(e.ToString()); }
SqlCommand myCommand = new SqlCommand("INSERT INTO [dbo].[Table1]" +
"([SQLServerInstanceNames])" +
"VALUES (SQLServerInstanceNames);", myConnection);
//Execute command
myCommand.ExecuteNonQuery();
//Close connection
try { myConnection.Close(); }
catch (Exception e) { Console.WriteLine(e.ToString()); }
答案 0 :(得分:5)
尝试使用SqlParameters。它将为您节省Sql Injection以及当前的问题。
myCommand.Parameters.AddWithValue("@param1", myValueWithCharacters);
答案 1 :(得分:1)
C#使用\
作为控制字符。您可以通过在字符串前添加@
字符来忽略它们:
String SQLServerInstanceNames = @"ussqlclus-db43\ussqlclusdb43; ussqlclus-db44\ussqltrysdb44; ussqltrys-db45\ussqltrysdb45;"
答案 2 :(得分:0)
只需像这样更新代码,在INSERT语句中包含parmeter
SqlCommand myCommand = new SqlCommand("INSERT INTO [dbo].[Table1]" +
"([SQLServerInstanceNames])" + "VALUES (@SQLServerInstanceNames);", myConnection);
myCommand.Parameters.AddWithValue("@SQLServerInstanceNames", "instance name");
注意我更新了VALUES部分并添加了@SQLServerInstanceNames - 这是您向查询添加参数的方法。
现在您使用参数,您不必担心特殊字符。这些将自动处理。