使用ExecuteNonQuery时丢失\

时间:2013-07-31 11:36:23

标签: c# sql

我正在尝试将单个值插入SQL数据库。只要我不插入“\”,它就可以正常工作。如果我这样做,那么我在数据库中丢失了一个“\”。

例如,在调试器中,我看到了这个命令文本:

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

但在SQL Server Profiler中,我总能找到这个Insert语句:

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

我的源代码:

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

我将源代码更改为:

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

我在调试过程中收到此信息: enter image description here

价值是“\\ Tesafilm” SQLValue是“\ Tesafilm”

2 个答案:

答案 0 :(得分:3)

改为使用parametrized query

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

}

答案 1 :(得分: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 here。它提供了一些可能更适合不同场景的“添加”方法 - 尽管在这种情况下常规.AddWithValue()应该可以正常工作。

更新:将我的原始.Add()更改为.AddWithValue(),因为MSDN状态SqlParameterCollection.Add()已弃用,而不是.AddWithValue()