如何在C#中执行TSQL输入命令,其中包含带有“ - ”,“\”或“;”的字符串

时间:2013-06-10 21:07:08

标签: c# sql-server tsql

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

3 个答案:

答案 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 - 这是您向查询添加参数的方法。

现在您使用参数,您不必担心特殊字符。这些将自动处理。