在调用存储过程时管理单引号

时间:2014-11-24 14:34:54

标签: c# sql-server stored-procedures

经过多次辩论后,我停止使用LINQ并转移到存储过程。现在我正在使用所有存储过程,我遇到了LINQ认为理所当然的事情。一个是单引号。

一位同事向我展示了以下方法,以便更容易调用存储过程,而无需为每个查询写出很长的路径。我现在的问题是处理诸如Mc'KayO'Reilly等人名之类的数据。单引号弄乱了我传递它的字符串。

public static void exe(string sql)
{
        SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString);

        SqlCommand cmd = new SqlCommand(sql, con);

        if (con.State == ConnectionState.Closed) { con.Open(); }

        cmd.ExecuteNonQuery(); con.Close();
    }

我一直在网站上使用这种方法和另一种非常相似的方法。我可以清理这种方法的最佳方法是什么,这样我就可以操作具有''''在它中,仍然是安全/安全的SQL注入。我希望在这个方法或帮助方法中做到这一点,所以我不必去自从我进行此切换后已经写入的每个查询。

我调用传入过程名称的存储过程,然后用逗号分隔后面的params。如果param是一个字符串,我用单引号括起来。

1 个答案:

答案 0 :(得分:0)

排序答案:在编写查询时用单引号替换单引号。这就是你如何逃避SQL Server中的单引号。即:

var escapedValue = originalValue.Replace("'","''");

好建议:如所有注释中所述,不要以这种方式编写查询,并使用参数化查询或存储过程,并传递参数值:您将避免数字和日期解析,SQL注入等问题攻击,以及更多不同的,多次意外的问题。

此外,如果您使用的是存储过程,则必须具有已有的参数。请简单地使用它们!这真的很容易:

换句话说:只需创建一个命令,将commant类型设置为存储过程,设置存储过程名称,将参数及其值添加到参数集合中,并将其除外。通过这种方式,您将忘记上述问题。