ado.net - 在 MVC 6 下使用 ADO.NET 的 DataTable 的替代方案是什么?

标签 ado.net asp.net-core-mvc c#-5.0

我正在创建一个 MVC 6 项目,我宁愿使用 Classic ADO.net 而不是 Entity Framework 7。但是,这两个 DataTable 都找不到 namespace 。和 SqlDataAdapter .我有一个使用 System.DataSystem.Data.SqlClient陈述。在我尝试构建项目之前,它不会显示错误。

我想我在某处读到这两个 namespace 在新版本中没有实现。如果是这样,是否有其他方法可以做到这一点,或者我是否缺少依赖项或 using 语句?

代码:

public static DataTable GetLog(string appName)
{
    DataTable table = new DataTable("ApplicationLog");
    SqlDataAdapter da = null;

    using (SqlConnection conn = DB.GetSqlConnection())
    {
        SqlCommand cmd = new SqlCommand("select * from ApplicationLog where application_name = @appname", conn);
        cmd.Parameters.Add(new SqlParameter("appname", System.Data.SqlDbType.NVarChar, 100));
        cmd.Parameters["appname"].Value = appName;


        da = new SqlDataAdapter(cmd);

        int res = da.Fill(table);
    }

    return table;
}

我的项目.json
{
    "userSecretsId": "aspnet5-ASPDemo-b25bb1cc-00e6-401e-9f49-5b59c08a030f",
    "version": "1.0.0-*",
    "compilationOptions": {
        "emitEntryPoint": true
    },

    "dependencies": {
        "Bestro": "1.0.0-*",
        "EntityFramework.Core": "7.0.0-rc1-final",
        "EntityFramework.Commands": "7.0.0-rc1-final",
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
        "Microsoft.ApplicationInsights.AspNet": "1.0.0-rc1",
        "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
        "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
        "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
        "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
        "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
        "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
        "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
        "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
        "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final",
        "DataTables.AspNet.AspNet5": "2.0.0-beta2"
    },

    "commands": {
        "web": "Microsoft.AspNet.Server.Kestrel",
        "ef": "EntityFramework.Commands"
    },

    "frameworks": {
        "dnx451": {
            "frameworkAssemblies": {
                "System.configuration": "4.0.0.0",
                "System.Data": "4.0.0.0"
            }
        } 
    },

    "exclude": [
        "wwwroot",
        "node_modules"
    ],
    "publishExclude": [
        "**.user",
        "**.vspscc"
    ],
    "scripts": {
        "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
    }
}

我最终尝试了很多不同的组件以尝试使其符合要求。如果有使用引用,请告诉我。

最佳答案

我理解这个问题,因为我喜欢自己在我的 C# 代码中使用现有的存储过程和动态 SQL 查询。为使用具有可为空属性的某些现有实体的每个查询创建新实体以保存新查询结果并不是一个好主意。此外,我喜欢使用 Web API 提供 JSON 格式的数据,以供在 JavaScript 编写的前端使用。

另一方面, Entity Framework 包含执行行 SQL 查询并将结果保存在没有使用实体的对象中的方法。我发布在 the answer可以使用的代码片段。我很快提醒了这个想法。

需要在应用程序的配置文件中包含连接字符串。例如,您可以创建 appsettings.json

{
  "Data": {
    "MyDbConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ApplicationDb;Trusted_Connection=True;MultipleActiveResultSets=true",
  }
}

然后你创建虚拟上下文类

public class MyDbContext : DbContext
{
}

没有 任何实体。您将使用 DbContext仅用于保持数据库连接。

然后你写Startup.cs哪个构造Configuration属性基于 "appsettings.json" 的内容.

public class Startup
{
    // property for holding configuration
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
            .AddEnvironmentVariables();
        // save the configuration in Configuration property
        Configuration = builder.Build();
    }
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc()
            .AddJsonOptions(options => {
                options.SerializerSettings.ContractResolver =
                    new CamelCasePropertyNamesContractResolver();
            });
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options => {
                options.UseSqlServer(Configuration["Data:MyDbConnectionString"]);
            });
    }
    ...
}

现在你有 MyDbContext注入(inject)并且可以在上下文中使用它,您可以使用

using (var cmd = MyDbContext.Database.GetDbConnection().CreateCommand()) {
    cmd.CommandText = "select * from ApplicationLog where application_name = @appname";
    if (cmd.Connection.State != ConnectionState.Open)
        cmd.Connection.Open();

    cmd.Parameters.Add(new SqlParameter("@appname", SqlDbType.NVarChar, 100) {
        Value = appName
    });

    da = new SqlDataAdapter(cmd);

    int res = da.Fill(table);
}

我个人更喜欢用List<dynamic>ExecuteReader/ExecuteReaderAsync而不是 DataTable (参见 the answer 中的代码),但这并不重要。

关于ado.net - 在 MVC 6 下使用 ADO.NET 的 DataTable 的替代方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34390090/

相关文章:

c# - 从 SQL Server 读取 VARBINARY(MAX) 到 C#

c# - textarea asp-for 不显示属性

visual-studio-2013 - 如何解决 Windows Azure 诊断运行时错误(无法创建 WindowsAzure.Diagnostics、Version=xx、Culture=neutral、PublicKeyToken=xx

c# - Azure 网站上的 "DataReader.GetFieldType(...) returned null"

c# - C#调用存储过程获取返回值和记录集

.net - 有人使用 Entity Framework *好吧*吗?

asp.net-core - Nopcommerce Okta 集成

asp.net-core - 如何在asp.net core MVC RC2中检索facebook用户个人资料图片

c# - 在派生构造函数中的某个代码块之后调用派生类中的基类构造函数

c# - 取消带有超时的静态异步函数