如何限制sqlite只执行SELECT语句,而不是INSERT,UPDATE

时间:2011-01-18 14:26:25

标签: c# sqlite select

我有一个报告页面,您可以在其中手动输入查询报告。如何阻止任何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”,但我认为这不是一个好习惯。

5 个答案:

答案 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做过任何事情,但我认为应该这样做......