Если вам просто нужен 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
, потому что они работают через курсор в виде пожарного шланга только для чтения. Что это фактически означает:
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, который они выполняют для получения набора результатов, не может обновлять данные.
person
dash
schedule
21.09.2012
GRANT SELECT ON [Table] TO [User]
). Кто-то может набрать что-то вродеSELECT * FROM User;DROP TABLE User;
, что технически является оператором sql, который возвращает набор результатов :-) Свойство SelectCommand просто предназначено для абстрагирования загрузки данных в адаптер - оно ничего не делает для предотвращения неправильного sql. от запуска. - person dash   schedule 21.09.2012