1

我有一个 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()); }
4

3 回答 3

5

尝试使用SqlParameters。它将使您免于 Sql Injection 以及您当前的问题。

myCommand.Parameters.AddWithValue("@param1", myValueWithCharacters);
于 2013-06-10T21:11:20.867 回答
1

C#\用作控制字符。您可以通过在字符串前面加上一个@字符来忽略这些:

String SQLServerInstanceNames = @"ussqlclus-db43\ussqlclusdb43; ussqlclus-db44\ussqltrysdb44; ussqltrys-db45\ussqltrysdb45;"
于 2013-06-10T21:25:20.843 回答
0

只需像这样更新您的代码以在 INSERT 语句中包含参数

SqlCommand myCommand = new SqlCommand("INSERT INTO [dbo].[Table1]" + 
        "([SQLServerInstanceNames])" + "VALUES (@SQLServerInstanceNames);", myConnection);
    myCommand.Parameters.AddWithValue("@SQLServerInstanceNames", "instance name");

请注意,我更新了 VALUES 部分并添加了@SQLServerInstanceNames——这是您向查询添加参数的方式。

既然您使用了参数,您就不必担心特殊字符了。这些将被自动处理。

于 2013-06-11T09:23:30.410 回答