C# 当其中一个值包含特殊字符时,存储过程失败

C# 当其中一个值包含特殊字符时,存储过程失败,c#,sql,visual-studio-2010,C#,Sql,Visual Studio 2010,我有一个特殊性格的问题。因为当有一个“字符”时,代码就会失败。如何使用下面的存储过程使其与特殊字符一起工作 internal bool AddRecord() { string SQL = "exec SqlInsert "; SQL += "'" + _sqlComputer + "', "; SQL += "'" + _lastUpdatedBy + "', ";

我有一个特殊性格的问题。因为当有一个“字符”时,代码就会失败。如何使用下面的存储过程使其与特殊字符一起工作

        internal bool AddRecord()
        {
             string SQL = "exec SqlInsert ";

             SQL += "'" + _sqlComputer + "', ";
             SQL += "'" + _lastUpdatedBy + "', ";
             SQL += "'" + DateTime.Now + "', ";
             SQL += "'" + _softwareName + "' ";

             return SqlDatabase.Overig(SQL);
        }
因为当有一个“字符”时,代码就会失败

然后试试这个:

internal bool AddRecord()
        {
             string SQL = "exec SqlInsert ";

             SQL += "'" + PrepeareForSql(_sqlComputer) + "', ";
             SQL += "'" + PrepeareForSql(_lastUpdatedBy) + "', ";
             SQL += "'" + DateTime.Now + "', ";
             SQL += "'" + PrepeareForSql(_softwareName) + "' ";

             return SqlDatabase.Overig(SQL);
        }

private string PrepeareForSql(string s)
{
   return s.Replace("'","''");
}
因为当有一个“字符”时,代码就会失败

然后试试这个:

internal bool AddRecord()
        {
             string SQL = "exec SqlInsert ";

             SQL += "'" + PrepeareForSql(_sqlComputer) + "', ";
             SQL += "'" + PrepeareForSql(_lastUpdatedBy) + "', ";
             SQL += "'" + DateTime.Now + "', ";
             SQL += "'" + PrepeareForSql(_softwareName) + "' ";

             return SqlDatabase.Overig(SQL);
        }

private string PrepeareForSql(string s)
{
   return s.Replace("'","''");
}
像这样

SqlCommand cmd = new SqlCommand("SqlInsert", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 25).Value = _sqlComputer ;
cmd.Parameters.Add("@Param2", SqlDbType.VarChar, 50).Value = _lastUpdatedBy ;
cmd.Parameters.Add("@Param3", SqlDbType.DateTime).Value = DateTime.Now
cmd.Parameters.Add("@Param4", SqlDbType.Varchar,50).Value = _softwareName ;

sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
sqlCon.Close();
dr.Dispose();
cmd.Dispose();
根据您的要求进行编辑

而不是像这样传递值

SqlDatabase.Overig(SQL);
这样做

SqlDatabase.Overig(_sqlComputer,_lastUpdatedBy,DateTime.Now,_softwareName);
并对Overig方法进行更改,如

Overig(String sqlCom, string UpdatedBy, DateTime dat, string software)
{
SqlCommand cmd = new SqlCommand("SqlInsert", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 25).Value = sqlCom;
cmd.Parameters.Add("@Param2", SqlDbType.VarChar, 50).Value = UpdatedBy;
cmd.Parameters.Add("@Param3", SqlDbType.DateTime).Value = dat
cmd.Parameters.Add("@Param4", SqlDbType.Varchar,50).Value = software;

sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
sqlCon.Close();
dr.Dispose();
cmd.Dispose();

 }
像这样

SqlCommand cmd = new SqlCommand("SqlInsert", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 25).Value = _sqlComputer ;
cmd.Parameters.Add("@Param2", SqlDbType.VarChar, 50).Value = _lastUpdatedBy ;
cmd.Parameters.Add("@Param3", SqlDbType.DateTime).Value = DateTime.Now
cmd.Parameters.Add("@Param4", SqlDbType.Varchar,50).Value = _softwareName ;

sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
sqlCon.Close();
dr.Dispose();
cmd.Dispose();
根据您的要求进行编辑

而不是像这样传递值

SqlDatabase.Overig(SQL);
这样做

SqlDatabase.Overig(_sqlComputer,_lastUpdatedBy,DateTime.Now,_softwareName);
并对Overig方法进行更改,如

Overig(String sqlCom, string UpdatedBy, DateTime dat, string software)
{
SqlCommand cmd = new SqlCommand("SqlInsert", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 25).Value = sqlCom;
cmd.Parameters.Add("@Param2", SqlDbType.VarChar, 50).Value = UpdatedBy;
cmd.Parameters.Add("@Param3", SqlDbType.DateTime).Value = dat
cmd.Parameters.Add("@Param4", SqlDbType.Varchar,50).Value = software;

sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
sqlCon.Close();
dr.Dispose();
cmd.Dispose();

 }

处理“”的一个简单方法就是添加.Replace(“”,“”)。这将用SQL可以处理的“”替换“”的所有实例

SQL += "'" + _sqlComputer.Replace("'", "''") + "', ";
SQL += "'" + _lastUpdatedBy.Replace("'", "''") + "', ";
SQL += "'" + DateTime.Now + "', ";
SQL += "'" + _softwareName.Replace("'", "''") + "' ";

处理“”的一个简单方法就是添加.Replace(“”,“”)。这将用SQL可以处理的“”替换“”的所有实例

SQL += "'" + _sqlComputer.Replace("'", "''") + "', ";
SQL += "'" + _lastUpdatedBy.Replace("'", "''") + "', ";
SQL += "'" + DateTime.Now + "', ";
SQL += "'" + _softwareName.Replace("'", "''") + "' ";

如果通过构建SQLCommand对象并向其添加参数来执行SQL,那么使用特殊字符作为参数会更容易


在这个相关的问题中,有一个很好的例子说明了如何做到这一点:

如果通过构建SQLCommand对象并向其添加参数来执行SQL,那么使用特殊字符作为参数将更容易



在这个相关的问题中有一个很好的例子说明了如何做到这一点:

稍微无关-不要通过附加字符串来构建SQL查询(这会使您更容易受到SQL注入的影响)。使用SQLCommand对象并向其添加参数。好的,谢谢您的回复。我以前从未这样做过。你有没有给我举个例子?看看-它向你展示了如何使用带参数的存储过程。啊,太好了。我会让你知道它什么时候起作用!:)谢谢@PhonicUK建议的参数也能解决你的撇号问题。另外,如果您有一个存储过程,为什么您的.net应用程序中有sql。稍微无关-不要通过附加字符串来构建sql查询(这会使您更容易受到sql注入的影响)。使用SQLCommand对象并向其添加参数。好的,谢谢您的回复。我以前从未这样做过。你有没有给我举个例子?看看-它向你展示了如何使用带参数的存储过程。啊,太好了。我会让你知道它什么时候起作用!:)谢谢@PhonicUK建议的参数也能解决你的撇号问题。另外,如果您有一个存储过程,为什么您的.net应用程序中有sql。+1,更好的是,如果您使用语句,对于SqlCommand和SqlConnection,SqlCommand我在另一个类中有它。我的代码只向另一个类发送一个参数和一条记录。所以我只需要一个回报。当我在另一个类中使用SqlCommand时,我如何使用它呢?但是您在问题中显示的代码。您正在将字符串传递给某个类。你到底想做什么?你可以将存储的proc参数传递给你正在谈论的类,而不是传递SqlCommand对象,并在该类中使用此代码I’我对SQL不是很在行:P你能帮我做更多吗?因为这更安全,我认为+1更好,如果您使用语句,对于SqlCommand和SqlConnection,SqlCommand在另一个类中有。我的代码只向另一个类发送一个参数和一条记录。所以我只需要一个回报。当我在另一个类中使用SqlCommand时,我如何使用它呢?但是您在问题中显示的代码。您正在将字符串传递给某个类。你到底想做什么?你可以将存储的proc参数传递给你正在谈论的类,而不是传递SqlCommand对象,并在该类中使用此代码I’我对SQL不是很在行:P你能帮我做更多吗?因为这更安全,我想谢谢,这是有效的:)有更多的特殊字符可以使我的代码失败吗?@Jamie an execelent Quission:)公平地说-不知道,但有这个问题。我个人从来不需要逃避其他字符。谢谢,这是有效的是:)有更多的特殊字符可以使我的代码失败吗?@Jamie an execelent Quission:)公平地说-不知道,但有这个问题。我个人从来不需要逃避其他角色。