更新的问题:有没有办法强制dataadapter只接受不包含任何update / drop / create / delete / insert命令的命令,而不是在发送到dataadapter之前验证command.text(否则抛出异常)。 dotnet在datareader dataadapter或其他任何其他产品中是否提供了这样的内置功能?
注意:DataReader返回结果,它也接受更新查询并返回结果。 (我可能会忽略一些错误,但是我在执行读者之前显示我的更新命令,然后在成功之后显示消息,这一切都很顺利
答案 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要返回的结果集,如果没有返回结果,则返回一个空数据集。
这意味着(无论如何你应该这样做)你应该只向你希望人们能够查询的表明确授予。
修改强>
要回答您的其他问题,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获取结果集没有理由不能更新数据。
答案 3 :(得分:0)
如果您有只读要求,请让TextBox使用一个连接字符串,该字符串使用的帐户只对SQL数据库具有db_datareader权限。
否则,是什么阻止了开发人员只是连接到数据库并且使用SqlCommand全部破坏了你的控制权?