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

Возможно ли использование ADO.NET в .NET Core?

Я хотел бы использовать самые последние версии ASP.NET Core, потому что я хочу создать с ним набор веб-API. Тем не менее, учебники, которые я нашел, сильно сосредоточены на Entity Framework. Я не могу использовать это, потому что у меня уже есть "устаревшая" база данных, поэтому подход Code-First не является вариантом.

Моя идея - использовать ADO.NET-подключения к моей базе данных, однако я не знаю, доступен ли System.Data.SqlClient в проекте ASP.NET Core. Я уже нашел, что доступен, когда я использую шаблон проекта .NET Framework, но доступен ли он в проекте .NET Core?

4b9b3361

Ответ 1

Существующие SqlConnection и другие связанные соединения все еще существуют в пространстве имен System.Data.SqlClient и должны работать как ожидается, используя полную структуру или .NET Core.

Вам просто нужно добавить соответствующие ссылки и использовать операторы, чтобы включить их, например, через пространство имен System.Data.SqlClient, как показано ниже в файле project.json:

введите описание изображения здесь

а затем вызовите его с помощью синтаксиса, к которому вы привыкли:

using(var connection = new SqlConnection("{your-connection-string}"))
{
      // Do work here
}

Итак, если у вас есть допустимая строка подключения для подключения к существующей старой базе данных, вы должны быть в порядке.

Что касается использования ORM

Я также обнаружил, что некоторые люди используют Dapper, Micro-ORM замена для Entity Framework, более гибкая. Это там любые преимущества использования его вместо ADO.NET?

Эти ORM (объектно-реляционные сопоставители) являются удобными и часто мощными инструментами, которые могут легче сопоставлять существующие данные базы данных с конкретными классами и объектами, что упрощает их использование (в отличие от итерации через устройство чтения данных, разбора каждый из ваших строк и создание каждого объекта вручную).

Что касается производительности, это в конечном счете зависит от того, что вы будете делать с вашими запросами. ADO.NET, как правило, будет самым быстрым, поскольку он подключен к базе данных с боковым костяком, однако в некоторых сценариях Dapper может побить его. Entity Framework, хотя и очень полезен, как правило, отстает в производительности, просто потому, что это такой большой ORM.

Опять же - это в конечном счете зависит от того, что вы делаете, но все это жизнеспособные варианты.

Ответ 2

.NET Core 2.0 имеет DataSet, DataTable и SQlDataAdapter. См. Мой ответ на https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/.

Код ниже работает отлично

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

Ответ 3

Важно отметить, что.NET Core не имеет DataSet, DataTable и связанных объектов до версии 2.0. Но до 2.0 он имеет все основные функции, такие как Connection, Command, Parameter, DataReader и другие связанные объекты.

Вы можете использовать следующие вызовы для упрощения подключения к SQL Server через поставщика баз данных SQL Server.

public class BaseDataAccess
{
    protected string ConnectionString { get; set; }

    public BaseDataAccess()
    {
    }

    public BaseDataAccess(string connectionString)
    {
        this.ConnectionString = connectionString;
    }

    private SqlConnection GetConnection()
    {
        SqlConnection connection = new SqlConnection(this.ConnectionString);
        if (connection.State != ConnectionState.Open)
            connection.Open();
        return connection;
    }

    protected DbCommand GetCommand(DbConnection connection, string commandText, CommandType commandType)
    {
        SqlCommand command = new SqlCommand(commandText, connection as SqlConnection);
        command.CommandType = commandType;
        return command;
    }

    protected SqlParameter GetParameter(string parameter, object value)
    {
        SqlParameter parameterObject = new SqlParameter(parameter, value != null ? value : DBNull.Value);
        parameterObject.Direction = ParameterDirection.Input;
        return parameterObject;
    }

    protected SqlParameter GetParameterOut(string parameter, SqlDbType type, object value = null, ParameterDirection parameterDirection = ParameterDirection.InputOutput)
    {
        SqlParameter parameterObject = new SqlParameter(parameter, type); ;

        if (type == SqlDbType.NVarChar || type == SqlDbType.VarChar || type == SqlDbType.NText || type == SqlDbType.Text)
        {
            parameterObject.Size = -1;
        }

        parameterObject.Direction = parameterDirection;

        if (value != null)
        {
            parameterObject.Value = value;
        }
        else
        {
            parameterObject.Value = DBNull.Value;
        }

        return parameterObject;
    }

    protected int ExecuteNonQuery(string procedureName, List<DbParameter> parameters, CommandType commandType = CommandType.StoredProcedure)
    {
        int returnValue = -1;

        try
        {
            using (SqlConnection connection = this.GetConnection())
            {
                DbCommand cmd = this.GetCommand(connection, procedureName, commandType);

                if (parameters != null && parameters.Count > 0)
                {
                    cmd.Parameters.AddRange(parameters.ToArray());
                }

                returnValue = cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            //LogException("Failed to ExecuteNonQuery for " + procedureName, ex, parameters);
            throw;
        }

        return returnValue;
    }

    protected object ExecuteScalar(string procedureName, List<SqlParameter> parameters)
    {
        object returnValue = null;

        try
        {
            using (DbConnection connection = this.GetConnection())
            {
                DbCommand cmd = this.GetCommand(connection, procedureName, CommandType.StoredProcedure);

                if (parameters != null && parameters.Count > 0)
                {
                    cmd.Parameters.AddRange(parameters.ToArray());
                }

                returnValue = cmd.ExecuteScalar();
            }
        }
        catch (Exception ex)
        {
            //LogException("Failed to ExecuteScalar for " + procedureName, ex, parameters);
            throw;
        }

        return returnValue;
    }

    protected DbDataReader GetDataReader(string procedureName, List<DbParameter> parameters, CommandType commandType = CommandType.StoredProcedure)
    {
        DbDataReader ds;

        try
        {
            DbConnection connection = this.GetConnection();
            {
                DbCommand cmd = this.GetCommand(connection, procedureName, commandType);
                if (parameters != null && parameters.Count > 0)
                {
                    cmd.Parameters.AddRange(parameters.ToArray());
                }

                ds = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
        catch (Exception ex)
        {
            //LogException("Failed to GetDataReader for " + procedureName, ex, parameters);
            throw;
        }

        return ds;
    }
 }

Более подробную информацию и примеры см. В следующей статье: http://www.ijz.today/2016/09/net-core-10-connecting-sql-server.html

Ответ 4

Как отметил Джо Хили в своем в DotNet Core 2.0, можно использовать все возможности System.Data.

Добавить nugets:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json - читать строку подключения из json
  • System.Data.Common
  • System.Data.SqlClient

config.json example:

{
  "connectionString": "your-db-connection-settings"
}

Вот пример консольного приложения.

class Program
{
    static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("config.json", false)
            .Build();

        var connectionString = configuration.GetSection("connectionString").Value;

        if(string.IsNullOrEmpty(connectionString))
            throw new ArgumentException("No connection string in config.json");

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "SELECT * FROM ExampleTable";
            using (var cmd = new SqlCommand(sql, conn))
            {
                using (var adapter = new SqlDataAdapter(cmd))
                {
                    var resultTable = new DataTable();
                    adapter.Fill(resultTable);
                }
            }
        }
    }
}