Возможно ли использование ADO.NET в .NET Core?
Я хотел бы использовать самые последние версии ASP.NET Core, потому что я хочу создать с ним набор веб-API. Тем не менее, учебники, которые я нашел, сильно сосредоточены на Entity Framework. Я не могу использовать это, потому что у меня уже есть "устаревшая" база данных, поэтому подход Code-First не является вариантом.
Моя идея - использовать ADO.NET-подключения к моей базе данных, однако я не знаю, доступен ли System.Data.SqlClient
в проекте ASP.NET Core. Я уже нашел, что доступен, когда я использую шаблон проекта .NET Framework, но доступен ли он в проекте .NET Core?
Ответы
Ответ 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);
}
}
}
}
}