2

I'm trying to insert a single value into an SQL Database. It works fine as long as I don't insert a "\". If I do, then I lose a "\" in the database.

For example, in the debugger I see this Command Text:

Insert into tblProjekte (Projektbezeichnung) values ('\\bla\\bla\\bla')

But in the SQL Server Profiler I always find this Insert Statement:

Insert into tblProjekte (Projektbezeichnung) values ('\bla\bla\bla')

My source code:

public void InsertProjekt(string Projektbezeichnung)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "Server=localhost; Database=myProjekt; UID=user; PWD=pwd";
    con.Open();

    SqlCommand com = new SqlCommand();
    com.Connection = con;
    com.CommandText = String.Format("Insert into tblProjekte (Projektbezeichnung) values ('{0}')",@Projektbezeichnung);
    int rows = com.ExecuteNonQuery();        
}

After I changed my Source Code to:

SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
            com.Parameters.AddWithValue("@Projektbezeichnung", Projekt.Projektbezeichnung);

I get this information during debugging: enter image description here

The Value is "\\Tesafilm" the SQLValue is "\Tesafilm"

4

2 回答 2

3

改用参数化查询

public void InsertProjekt(string Projektbezeichnung)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "Server=localhost; Database=myProjekt; UID=user; PWD=pwd";
    con.Open();

    SqlCommand com = new SqlCommand();
    com.Connection = con;
    com.CommandText = "Insert into tblProjekte (Projektbezeichnung) values (@value)"
    com.Parameters.AddWithValue("@value", Projektbezeichnung);

    int rows = com.ExecuteNonQuery();

}

于 2013-07-31T11:42:44.847 回答
3

正如一些评论指出的那样,该\字符是 SQL 中的“转义字符”。当您在不使用正确转义字符串的情况下插入它时,SQL 会将它们删除,因为它将它们解释为只是转义字符。

您正在使用string.Format()模拟参数化查询,但这并不能真正削减它。但是,如果您使用SqlCommand.Parameters.AddWithValue(),它应该可以解决您的问题:

SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
com.Parameters.AddWithValue("@Projektbezeichnung", Projektbezeichnung);
com.Connection = con;
int rows = com.ExecuteNonQuery();

有关SqlCommand.Parameters收集的更多信息,请在此处的 MSDN上查看。它提供了一些可能更适合不同场景的“添加”方法——尽管.AddWithValue()在这种情况下常规应该可以正常工作。

更新:将我原来.Add()的更改.AddWithValue()为 MSDN 状态SqlParameterCollection.Add()已被弃用.AddWithValue()

于 2013-07-31T11:43:28.193 回答