我正在使用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; } }
答案 0 :(得分:0)
好的,更多的测试显示我正在谈论关于没有被逃脱的单引号的垃圾 - 它完全逃脱了它。实际发生的是@" \"当Npgsqlcommand是一个ilike查询时,当发送到ExecuteReader方法时,(反斜杠)字符没有被转义。所有其他方法似乎都逃脱了反斜杠。
我设法通过替换@" \"的任何实例来修复它。与@" \"关于将通过ExecuteReader命令读入数据表的ilike查询中使用的参数。现在一切都很好了:))
感谢Shay给了这个初级程序员我需要进行适当的测试。还要感谢我的床,它给了我睡眠,我需要能够在第二天进行适当的测试。