为什么Npgsqlcommand参数化在使用executereader时不会转义单引号,但在使用executiontenonquery时是这样做的?

时间:2018-04-22 08:28:49

标签: npgsql

我正在使用C#和Postgres。我推出了自己的安全措施,以逃避我所知道的特殊字符(如单引号),但后来被告知我不需要这样做 - 参数化可以为我做这一切!

所以我删除(存档)了我的代码并用参数化的Npgsqlcommands替换了所有代码。太好了!

但是,一些测试显示在使用NpgsqlCommand.ExecuteReader()时它不会转义单引号。

当我执行NpgsqlCommand.ExecuteNonQuery()时似乎工作正常。我在此消息的底部列出了我的工作代码,万一有人这样做会发现它并发现它很有用。

我是一个新手,非常感谢有经验的人查看我的代码并帮助我理解我做错了什么。

这是我的返回数据的SQL查询方法:

public static bool ExecuteSQLQuery(NpgsqlCommand cmdText, out DataTable dataTable)
        {
            try
            {
                string connectionString = ConfigurationManager.AppSettings["connectionString"];

                NpgsqlConnection sqlConnection = new NpgsqlConnection(connectionString);
                sqlConnection.Open();

                cmdText.Connection = sqlConnection;

                dataTable = new DataTable();
                dataTable.Load(cmdText.ExecuteReader(CommandBehavior.CloseConnection));

                sqlConnection.Close();

                return true;
            }
            catch(Exception ex)
            { dataTable = new DataTable();  return false; }
        }

这是我调用该代码的代码:

DataTable dataTable = new DataTable();
            NpgsqlCommand sqlCommand = new NpgsqlCommand("SELECT * FROM users.users WHERE (email ilike @email or username ilike @username)");
            sqlCommand.Parameters.AddWithValue("email", NpgsqlTypes.NpgsqlDbType.Varchar, email);
            sqlCommand.Parameters.AddWithValue("username", NpgsqlTypes.NpgsqlDbType.Varchar, username);

DatabaseConnectivity.ExecuteSQLQuery(sqlCommand, out dataTable)

如果我用单引号字符喂它就会失败。

提前感谢您的帮助。

PS:这是我的SQL工作代码,它不返回任何数据:

public static bool ExecuteSQLNonQuery(NpgsqlCommand cmdText)
        {
            try
            {
                string connectionString = ConfigurationManager.AppSettings["connectionString"];

                NpgsqlConnection sqlConnection = new NpgsqlConnection(connectionString);
                sqlConnection.Open();

                cmdText.Connection = sqlConnection;
                cmdText.ExecuteNonQuery();

                sqlConnection.Close();

                return true;
            }
            catch (Exception ex)
            { return false; }
        }

1 个答案:

答案 0 :(得分:0)

好的,更多的测试显示我正在谈论关于没有被逃脱的单引号的垃圾 - 它完全逃脱了它。实际发生的是@" \"当Npgsqlcommand是一个ilike查询时,当发送到ExecuteReader方法时,(反斜杠)字符没有被转义。所有其他方法似乎都逃脱了反斜杠。

我设法通过替换@" \"的任何实例来修复它。与@" \"关于将通过ExecuteReader命令读入数据表的ilike查询中使用的参数。现在一切都很好了:))

感谢Shay给了这个初级程序员我需要进行适当的测试。还要感谢我的床,它给了我睡眠,我需要能够在第二天进行适当的测试。