簡體   English   中英

使SqlDataAdapter / Datareader“真的只讀”

[英]Making SqlDataAdapter/Datareader “Really Read-Only”

更新的問題:有沒有辦法強制dataadapter只接受除了在發送到dataadapter之前驗證command.text之外不包含任何update / drop / create / delete / insert命令的命令(否則拋出異常)。 是否在datareader dataadapter或其他任何其他網絡中由dot net提供了這樣的內置功能?

注意:DataReader返回結果,它也接受更新查詢並返回結果。 (我可能省略了一些錯誤,但是我在執行讀者之前顯示我的更新命令,然后在成功之后顯示消息,這一切都很順利

你能在字符串中搜索一些關鍵字嗎? 像CREATE,UPDATE,INSERT,DROP或者如果查詢不以SELECT開頭? 或者這太脆弱了?

您可能還想為此應用程序創建僅具有讀取功能的登錄名。 我不知道對象是否具有該屬性,但您可以讓服務器拒絕該事務。

您需要做的就是確保沒有為DataAdapter准備INSERT,UPDATE或DELETE語句。 您的代碼可能如下所示:

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

要么

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

而且,你有一個只讀數據適配器。

如果您只是想要一個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時,它仍然會運行傳遞給它的任何命令 - 它只是期望返回一個結果集,如果沒有返回結果,那么它返回一個空數據集。

這意味着(無論如何你應該這樣做)你應該只顯示你希望人們能夠查詢的表的SELECT權限

編輯

要回答你的另一個問題, SqlDataReaderReadOnly因為它們通過只讀的firehose樣式游標工作。 這實際上意味着:

while(reader.Read()) //Reads a row at a time moving forward through the resultset (`cursor`)
{
   //Allowed
   string name = reader.GetString(reader.GetOrdinal("name"));
   //Not Allowed - the read only bit means you can't update the results as you move through them
   reader.GetString(reader.GetOrdina("name")) = name;
}

它是只讀的,因為它不允許您在瀏覽記錄時更新記錄。 他們執行的sql獲取結果集沒有理由不能更新數據。

如果您具有只讀要求,請讓TextBox使用連接字符串,該字符串使用僅對SQL數據庫具有db_datareader權限的帳戶。

否則,是什么阻止了開發人員只是連接到數據庫並使用SqlCommand全部破壞了你的控制?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM