.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;

Может кто-нибудь предложить, как я могу переопределить этот код, используя то, что поддерживается? Спасибо

 Hughgo27 июл. 2016 г., 11:17
Спасибо за ответ, но не уверен, насколько это полезно. Я предполагал, что многие другие столкнутся с этой проблемой, и что они не все решают ее решить путем реализации частей Framework.
 Sujit.Warrier27 июл. 2016 г., 11:39
используйте или Entryframework или Dapper. за это
 ProfK12 июл. 2017 г., 07:25
@ Sujit.Warrier Как я могу получить нетипизированные результаты запроса от Dapper?
 Corak27 июл. 2016 г., 10:52
Ну, вы могли бы начать с просмотра справочного источника дляSqlDataAdapter а такжеТаблица данных и переопределить части, которые вам действительно нужны ... также: удачи.
 Corak27 июл. 2016 г., 11:22
Ну, одна проблема заключается в том, что если .Net Core не знает оDataTableтогда ты не сможешьreturn dt и все остальное, что будет работать сDataTable больше не будет работать Таким образом, вопрос в том, какие функциональные возможностиDataTable вам действительно нужно, и можете ли вы использовать, например,DataReader вместо этого (еслиDataReader доступно в .Net 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 со своим собственным Query (как это делает LINQ); вместо этого он позволяет вам делать простые независимые от БД запросы из бизнес-логики и инкапсулировать сложный синтаксис SQL со специальными представлениями данных на уровне приложения, которые доступны как таблицы только для чтения.

Также можно указать необработанный SQL-запрос напрямую сSelect Перегрузка метода (как FromSql в EF Core):

var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>();
 ProfK05 июл. 2017 г., 15:01
Спасибо, @VitaliyFedorchenko. За несколько часов до того, как я смогу дать вам награду, но в остальном она ваша.
 Hughgo28 июл. 2016 г., 11:42
Спасибо за все ответы. Я использовал DataReader и облегченную таблицу данных (которая в основном представляет собой списки списков)
 ProfK05 июл. 2017 г., 08:07
Спасибо, @VitaliyFedorchenko, я не был от этого. Ответ с небольшим примером, как использовать сырой SQL против именованного артефакта БД вQuery объект получит вам награду. Я не могу просто создать именованное представление для каждого запроса, который я хочу выполнить.
 ProfK01 июл. 2017 г., 07:01
Как, черт возьми, вы взяли такой проект с нуля, когда ваши объекты запросов ограничены именованной таблицей? Как насчет буквально миллионов случаев за пределами манежа, где запрос источника данных может быть динамическим SQL, объединением и т. Д.?
 Vitaliy Fedorchenko04 июл. 2017 г., 10:28
@ProfK Query - это общая структура, которая содержит условия и другие параметры; он не ограничивается таблицами - вы можете указать представление данных базы данных или инкапсулировать сложный запрос SQL (с JOIN, GROUP BY и т. д.) как представление данных уровня приложения (см. класс DbDataView, его можно зарегистрировать в DbCommandBuilder.Views). В конце концов, вы можете предоставить необработанный SQL-запрос, как в EF Core или Dapper.
 Vitaliy Fedorchenko05 июл. 2017 г., 14:35
@ProfK Я добавил фрагменты кода, которые иллюстрируют, как использовать представления данных на уровне приложения для сложных запросов SQL и необработанного SQL.
 Vitaliy Fedorchenko28 июл. 2016 г., 11:58
@Hughgo с использованием DataReader - это, конечно, самое простое (и наиболее эффективное) решение :) Я надеюсь, что вы когда-нибудь попробуете библиотеку NReco.Data. Не стесняйтесь обращаться ко мне в случае каких-либо вопросов или проблем.

ОБНОВИТЬ: Этот ответ соответствует .NET Core 1.x (который был последним на момент написания этой статьи). Если вы используете .NET Core 2.x (в бета-версии на июль / 2017), проверьте ответ Джо.

Оригинальный ответ:

Рекомендуем прочитать:Портирование на .NET Core

Я цитирую:

System.Data, Хотя базовый уровень уже является частью .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, в этом случае эторуководство удобно

 ProfK05 июл. 2017 г., 15:05
Близко, но не сигара.
 Gerardo Grignoli13 июл. 2017 г., 16:14
Спасибо, я обновил ответ. Приятно знать, что это поддерживается сейчас.
 Joe Healy13 июл. 2017 г., 15:26
устаревший ответ. больше не правильно.

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;
}
 djoyce19 июл. 2017 г., 10:38
Начиная с VS2017 Preview 15.4 для этого требуется предварительная версияSystem.Data.SqlClient
 Joe Healy13 июл. 2017 г., 15:26
рад, что это помогло тебе.
 Joe Healy30 мар. 2018 г., 15:25
re oracle .NET Core и Entity Framework Заявление о направлении - март 2018 г. - www.oracle.com/technetwork/topics/dotnet/tech-info/odpnet-dotnet-ef-core-sod-4395108.pdf ODP.NET Core Beta Загрузить -oracle.com/technetwork/topics/dotnet/downloads/... Дискуссионный форум ODP.NET -community.oracle.com/community/database/developer-tools/...
 H.Al29 мар. 2018 г., 09:25
Привет, есть ли способ сделать это с оракулом DB?
 Fabulous12 июл. 2017 г., 00:20
Я еще не использовал VS2017 Preview 15.3, поэтому я не знал об этой разработке.

Ваш ответ на вопрос