C# 使用ExecuteOnQuery时丢失\

C# 使用ExecuteOnQuery时丢失\,c#,sql,C#,Sql,我试图在SQL数据库中插入一个值。只要我不插入“\”就可以了。如果我这样做,那么我会在数据库中丢失一个“\” 例如,在调试器中,我看到以下命令文本: Insert into tblProjekte (Projektbezeichnung) values ('\\bla\\bla\\bla') 但在SQL Server Profiler中,我总是可以找到以下Insert语句: Insert into tblProjekte (Projektbezeichnung) values ('\bla\b

我试图在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);
我在调试期间获得以下信息:

该值为“\\Tesafilm” SQLValue为“\Tesafilm”

请改用:


}

正如一些评论所指出的,
\
字符是SQL中的“转义字符”。当您在没有使用正确转义字符串的情况下插入它时,SQL会将它们去掉,因为它将它们解释为转义字符

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

SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
com.Parameters.AddWithValue("@Projektbezeichnung", Projektbezeichnung);
com.Connection = con;
int rows = com.ExecuteNonQuery();
有关
SqlCommand.Parameters
集合的更多信息,请访问。它提供了一些“添加”方法,这些方法可能更适合于不同的场景-尽管常规的
。AddWithValue()
在这种情况下应该可以正常工作


更新:将我原来的
.Add()
更改为
.AddWithValue()
,因为MSDN声明
SqlParameterCollection.Add()
已被弃用,取而代之的是
.AddWithValue()

您正在插入SQL转义字符。您确实应该使用参数,而不是内联格式。这对SQL注入是完全开放的。使用@param,然后将带值的参数添加到您的命令中,您应该很好。将
@
放在变量名之前并不意味着您使用的是参数化查询。您应该使用真实参数。问题是什么?请清楚地张贴问题。请不要在表格前面加上
tbl
。我想你忘了在AddWithValue@trippino它在有@和没有@的情况下工作。我添加它是为了遵循MSDN指南。好的,对不起,我通常会添加“@”,因此我认为这是必要的。对不起,但这并不能解决我的问题,我在SQL Server中收到的信息与以前一样。我正在使用SQL Server 2012并将此函数作为wcf服务运行。我填写了我的TestClient\\After-tip from Stackoverflow,收到了\After-tip from Stackoverflow。我又丢失了一个\。您的答案中的Add已过时。它已被替换为AddWithValue@BasBrekelmans我只是在MSDN上读到了这一点;我现在正在更新我的答案=]很抱歉,但这并不能解决我的问题,我在SQL Server中收到的信息与以前一样。我正在使用SQL Server 2012并将此函数作为wcf服务运行。我填写了我的TestClient\\After-tip from Stackoverflow,收到了\After-tip from Stackoverflow。我又丢了一本书。
SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
com.Parameters.AddWithValue("@Projektbezeichnung", Projektbezeichnung);
com.Connection = con;
int rows = com.ExecuteNonQuery();