在.NET 核心中可以使用 ADO.NET 吗?

大多数教程是实体框架,没有提到 Ado。收网。网络核心项目。我有一个“遗留”数据库,所以 EF/“代码优先”方法不是一个选项。

对于 ADO.NET 连接,System.Data.SqlClient是否可用于 ASP.NET 核心项目?

当我使用。NETFramework 项目模板,但是在。NET 核心项目? ?

105294 次浏览

现有的 SqlConnection和其他相关连接仍然存在于 System.Data.SqlClient名称空间中,应该使用完整的框架或。NET 核心。

您只需要添加适当的引用并使用语句来包含它,例如通过 System.Data.SqlClient名称空间,如下面的 project.json文件所示:

enter image description here

然后用你习惯的语法调用它:

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

因此,只要有一个有效的连接字符串可以连接到现有的遗留数据库,就可以了。

关于 ORM 的使用

我还发现有些人在使用 Dapper,一种 Micro-ORM 实体框架的替代品,显然更加灵活 用它代替 ADO.NET 有什么好处吗?

这些 ORM (对象-关系映射器)是方便且通常功能强大的工具,它们可以更容易地将现有数据库数据映射到特定的类和对象,从而使它们更容易使用(而不是通过数据读取器迭代,解析每一行并手动构建每个对象)。

就性能而言,最终取决于您将如何处理查询。NET 通常是最快的,因为它是到数据库的基本连接,但在某些情况下,Dapper 实际上可以击败它。实体框架虽然非常有用,但通常在性能方面落后,这仅仅是因为它是一个如此庞大的 ORM。

同样,这最终取决于你正在做什么,但所有的都是可行的选择。

值得注意的是。NET Core 在2.0版之前没有 DataSet、 DataTable 和相关对象。但是在2.0之前,它具有所有的核心特性,比如 Connection、 Command、 Parameter、 DataReader 和其他相关对象。

可以使用以下调用通过 SQLServer 数据库提供程序简化与 SQLServer 的连接。

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

.NET Core 2.0有 DataSet、 DataTable 和 SQlDataAdapter。

下面的代码工作正常

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

正如 Joe Healy 在 DotNet Core 2.0的 回答中提到的,可以使用所有 System.Data 特性。

加入鸡块:

  • 微软,扩展,配置
  • 从 Json 读取连接字符串
  • 系统,数据,通用
  • System.Data. SqlClient

Json 例子:

{
"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);
}
}
}
}
}

在 ADO.NET 核心中,我不使用 System.Data.SqlClient,但我使用 Microsoft. Data. SqlClient。 到目前为止,我可以使用所有我以前的代码。

LinDowsMac 先生

你还是可以用 EF

有一个工具叫做脚手架-dbcontext

它将根据遗留数据库结构为您创建“实体”部分类。

您需要考虑一下管理“实体”和 dbcontext 类,它们是与您的其他代码分开创建的。(该工具可以覆盖现有的类)。也许是个模特项目?

我已经在.net 核心中为 SQLSERVER 和 ORACLE 项目使用过这种方法

您还需要其他包裹:

  • 如果 SQLSERVER 选择 Microsoft 包
  • 如果 ORACLE 选择 ORACLE 包(即使它们是以前的.net 核心版本)

看这个 链接