我有一个报告页面,您可以在其中手动输入查询报告。如何阻止任何INSERT,UPDATE或DELETE语句,并且只运行SELECT?
using (var connection = new SQLiteConnection(connectionString))
{
var da = new SQLiteDataAdapter
{
SelectCommand = new SQLiteCommand(query, connection)
};
try
{
da.Fill(table);
}
我可以检查查询字符串是否包含“INSERT”,“UPDATE”或“DELETE”,但我认为这不是一个好习惯。
答案 0 :(得分:1)
检查查询字符串不是好习惯吗?相比什么?允许用户在报表页面中输入他们想要的任何SQL语句?我想不出比这更糟糕的做法。如果您要允许这种事情,您绝对需要以某种方式限制它们输入的语句类型,并且可能需要Where子句(以避免返回数百万行)等。
答案 1 :(得分:1)
实际上你是否检查了当你尝试使用数据适配器填充表时会发生什么?查询变量中只有select而不是?我怀疑你得到一个空表或数据集,我希望有一个例外,在这种情况下你可以回滚事务。
无论如何,我会尝试像Sorax上面建议的那样只读取连接,我实际上也会解析查询变量。
答案 2 :(得分:1)
您可以使用EXPLAIN
语句将查询分解为VM指令并检查输出的opcode
列。如果值"OpenWrite"
出现,则查询不是只读的。
答案 3 :(得分:0)
由于SQlite数据库只是一个文件,我的猜测是你可以通过文件系统只读数据库。这当然不是一个花哨的解决方案,而是一个不需要任何代码的解决方案(当然,除非你在写不可能时抛出异常)。
答案 4 :(得分:0)
A)使用只读连接 - 我认为这几乎是最好的解决方案
B)使用多个TextBox作为输入(但这将成为更像解决方案,如检查String for Insert等。)
例如
选择| _ ___ |来自| __ _ __ _ ___ |其中| __ _ __ _ _ |
编辑:回答你的评论只看一下http://www.sqlite.org/c3ref/open.html特别是主题“SQLITE_OPEN_READONLY” - 我现在没有对sqlite做过任何事情,但我认为应该这样做......