使SqlDataAdapter / Datareader“真的只读”

时间:2012-09-21 11:23:36

标签: c# sql-server winforms sqldatareader sqldataadapter

更新的问题:有没有办法强制dataadapter只接受不包含任何update / drop / create / delete / insert命令的命令,而不是在发送到dataadapter之前验证command.text(否则抛出异常)。 dotnet在datareader dataadapter或其他任何其他产品中是否提供了这样的内置功能?

注意:DataReader返回结果,它也接受更新查询并返回结果。 (我可能会忽略一些错误,但是我在执行读者之前显示我的更新命令,然后在成功之后显示消息,这一切都很顺利

4 个答案:

答案 0 :(得分:2)

您可以在字符串中搜索某些关键字吗?像CREATE,UPDATE,INSERT,DROP或者如果查询不以SELECT开头?或者这太脆弱了?

您可能还希望为此应用程序创建仅具有读取功能的登录名。我不知道对象是否具有该属性,但您可以让服务器拒绝该事务。

答案 1 :(得分:1)

您需要做的就是确保没有为DataAdapter准备INSERT,UPDATE或DELETE语句。您的代码可能如下所示:

var dataAdapter = new SqlDataAdapter("SELECT * FROM table", "connection string");

OR

var dataAdapter = new SqlDataAdapter("SELECT * FROM table", sqlConnectionObject);

bam,你有一个只读数据适配器。

答案 2 :(得分:1)

如果您只是想要一个DataTable,那么以下方法很简短并降低了复杂性:

public DataTable GetDataForSql(string sql, string connectionString)
{
    using(SqlConnection connection = new SqlConnection(connectionString))
    {
        using(SqlCommand command = new SqlCommand())
        {
            command.CommandType = CommandType.Text;
            command.Connection = connection;
            command.CommandText = sql;
            connection.Open();          
            using(SqlDataReader reader = command.ExecuteReader())
            {
                DataTable data = new DataTable();
                data.Load(reader);
                return data;
            }

        }

    }

}

用法:

try{
    DataTable results = GetDataForSql("SELECT * FROM Table;", ApplicationSettings["ConnectionString"]);
}
catch(Exception e)
{
    //Logging
    //Alert to user that command failed.
}

这里没有必要使用DataAdapter - 它并不是你想要的。如果使用更新,删除或插入命令,为什么还要去捕捉异常等?它不适合你想做的事情。

重要 注意,SelectCommand属性没有做任何特殊的事情 - 当执行SelectCommand时,它仍将运行传递给它的任何命令 - 它只返回expects要返回的结果集,如果没有返回结果,则返回一个空数据集。

这意味着(无论如何你应该这样做)你应该只向你希望人们能够查询的表明确授予