[英]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權限 。
編輯
要回答你的另一個問題, SqlDataReader是ReadOnly
因為它們通過只讀的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.