asp.net ADO.NET在.NET内核中是否可行?

dfuffjeb  于 2022-12-20  发布在  .NET
关注(0)|答案(7)|浏览(130)

大多数教程都是实体框架,在.Net核心项目中没有提到Ado .NET。我有一个“遗留”数据库,所以EF/“代码优先”方法不是一个选项。
对于ADO .NET连接,System.Data.SqlClient是否可用于ASP.NET核心项目?
它在使用.NET Framework项目模板时可用,但在.NET核心项目中是否仍然可用?

ct3nt3jp

ct3nt3jp1#

现有的SqlConnection和其他相关连接仍然存在于System.Data.SqlClient命名空间中,使用完整的框架或.NET核心应该可以按预期工作。
您只需要添加适当的引用和using语句来包含它,例如通过System.Data.SqlClient命名空间,如下面project.json文件中所示:

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

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

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

关于ORM的使用

我也发现有些人用Dapper,一个Micro-ORM替代实体框架,看起来更灵活。用它代替ADO .NET有什么好处吗?
这些ORM(对象关系Map器)是方便且通常功能强大的工具,可以更轻松地将现有数据库数据Map到特定的类和对象,从而使它们更易于使用(与通过数据读取器迭代、解析每行并手动构建每个对象相反)。
至于性能,它最终取决于你要用你的查询做什么。ADO .NET通常是最快的,因为它是到数据库的最基本的连接,然而在某些情况下,Dapper实际上可以击败它。实体框架,虽然非常有用,但通常在性能上落后,仅仅是因为它是一个如此大的ORM。
再次-它最终取决于你在做什么,但所有都是可行的选择。

kiayqfof

kiayqfof2#

NET核心2.0有数据集、数据表和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;
 }
hivapdat

hivapdat3#

正如Joe Healy在他的answer in DotNet Core 2.0中提到的,可以使用所有System.data特性。
添加金块:

  • Microsoft.Extensions.Configuration
  • Json--用于从json读取连接字符串
  • System.Data.Common
  • System.Data.SqlClient

config.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);
                }
            }
        }
    }
}
nnvyjq4y

nnvyjq4y4#

值得注意的是,.NET Core在2.0版本之前没有DataSet、DataTable和相关对象。但在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

lhcgjxsq

lhcgjxsq5#

在ADO .NETCore中,我不使用System.Data.SqlClient,但我使用Microsoft.Data.SqlClient。到目前为止,我可以使用我以前所有的编码!

dkqlctbz

dkqlctbz6#

  • -林道斯·麦克先生
    你仍然可以使用EF
    有一个称为scaffold-dbcontext的工具
    它将基于遗留数据库结构为您创建“实体”分部类。
    您需要稍微给予一下“实体“的管理以及它与其他代码分开创建的dbcontext类(该工具可以覆盖现有的类)。
    我已经在.net core中为SQL SERVER和ORACLE项目使用了此功能
    您将需要其他软件包:
  • 如果SQLSERVER选择Microsoft软件包
  • 如果ORACLE选择ORACLE软件包(即使它们是以前的.net Core版本)

查看此链接

相关问题