Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.Data​​STRONG > . Хотя базовый уровень уже является частью .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>();