.Net Core, как реализовать SQLAdapter./Функция DataTable
У меня простая процедура .NET Framework, которая запускает запрос и возвращает объект DataTable. Мне нужно перенести это в .Net Core, однако я полагаю, что SQLAdapter и DataTable не поддерживаются
SqlConnection con = new SqlConnection(m_ConnectString);
SqlCommand cmd = new SqlCommand(strQuery);
SqlDataAdapter sda = new SqlDataAdapter();
// assign the transaction and connection to the command object
cmd.Connection = con;
sda.SelectCommand = cmd;
DataTable dt = new DataTable();
// execute query and soak up results
sda.Fill(dt);
return dt;
Может кто-нибудь предложить, как я могу переопределить этот код, используя то, что поддерживается?
Благодаря
Ответы
Ответ 1
SqlDBAdapter
и DataTable
теперь поддерживаются.
Вы должны использовать VS2017 Preview 15.3, target.net core 2.0 и добавить пакеты NuGet для System.Data.Common
, а также System.Data.SqlClient
. Код ниже.
Подробнее см. https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/.
public static DataTable ExecuteDataTable(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
DataTable dt = new DataTable();
dt.Columns.Add("CustomerID");
dt.Columns.Add("CustomerName");
SqlDataReader dr = ExecuteReader(conn, cmdType, cmdText, cmdParms);
while (dr.Read())
{
dt.Rows.Add(dr[0], dr[1]);
}
return dt;
}
public static DataTable ExecuteDataTableSqlDA(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
System.Data.DataTable dt = new DataTable();
System.Data.SqlClient.SqlDataAdapter da = new SqlDataAdapter(cmdText, conn);
da.Fill(dt);
return dt;
}
Ответ 2
ОБНОВЛЕНИЕ: Этот ответ соответствует .NET Core 1.x(который был последним в то время, когда я это написал).
Если вы используете .NET Core 2.x(в бета-версии по состоянию на июль /2017 год), проверьте ответ Джо.
Оригинальный ответ:
Рекомендуемое чтение: Портирование на .NET Core
Я цитирую:
- System.DataSTRONG > . Хотя базовый уровень уже является частью .NET Core, то есть модели поставщика и клиента SQL, некоторые функции в настоящее время недоступны, например, поддержка схемы и DataTable/DataSet.
Вы можете использовать SqlDataReader, но не SqlAdapter или DataTable.
Начните с добавления System.Data.SqlClient
пакета NuGet.
Затем вы можете...
var con = new SqlConnection("...");
var cmd = con.CreateCommand();
cmd.CommandText = "...";
var reader = cmd.ExecuteReader();
// populate your custom data structure
Работает ли IList<Dictionary<string, object>>
для вас?
var results = new List<Dictionary<string, object>>();
while (reader.Read())
{
results.Add(Enumerable.Range(0, reader.FieldCount).ToDictionary(reader.GetName, reader.GetValue));
}
return results;
Итак, теперь вы можете читать с помощью results[0]["FirstName"].ToString()
Если вы не хотите переключиться на ядро Entity Framework Core, в этом случае этот учебник удобен.
Ответ 3
Вместо DataAdapter/DataTable вы можете использовать одну из существующих библиотек DAL для .NET Core, которые поддерживают операции CRUD над низкоуровневыми интерфейсами ADO.NET. Недавно я опубликовал NReco.Data: независимый от поставщика DAL, который поддерживает автоматическое создание SQL-запросов, абстрактные запросы и простые записи CRUD-операций.
Например, фрагмент кода из вопроса может быть переопределен следующим образом:
var con = new SqlConnection(m_ConnectString);
var dbFactory = new NReco.Data.DbFactory(
System.Data.SqlClient.SqlClientFactory.Instance);
var dbCmdBuilder = new NReco.Data.DbCommandBuilder(dbFactory);
var dbAdapter = new NReco.Data.DbDataAdapter(con, dbCmdBuilder);
var selectRecordsList = dbAdapter.Select(
new Query("some_table") ).ToList<Dictionary<string,object>>();
Сложные SQL-запросы могут выполняться как представления данных на уровне приложений:
dbCmdBuilder.Views["some_view"] = new DbDataView(
@"SELECT @columns FROM Employee emp
LEFT JOIN Company c ON (c.Id=emp.CompanyId)
@where[ WHERE {0}] @orderby[ ORDER BY {0}]
") {
FieldMapping = new Dictionary<string,string>() {
{"Id", "emp.Id"},
{"*", "emp.*, c.Title as CompanyTitle"}
}
};
var someViewRS = dbAdapter.Select( new Query("some_view") ).ToRecordSet();
NReco.Data не пытается заменить SQL собственным запросом (например, LINQ); вместо этого он позволяет вам создавать простые DB-независимые запросы из бизнес-логики
и инкапсулировать сложный синтаксис SQL со специальными типами данных на уровне приложения, доступ к которым можно использовать как таблицы, доступные только для чтения.
Также можно указать необработанный SQL-запрос непосредственно с перегрузкой метода Select
(например, FromSql в EF Core):
var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>();