【问题标题】:What's the alternative to DataTable with ADO.NET under MVC 6?在 MVC 6 下使用 ADO.NET 的 DataTable 的替代方案是什么?
【发布时间】:2016-07-17 12:16:27
【问题描述】:

我正在创建一个 MVC 6 项目,并且我宁愿使用 Classic ADO.net 而不是 Entity Framework 7。但是据说无法找到 DataTableSqlDataAdapter 的名称空间。我有一个 using System.DataSystem.Data.SqlClient 声明。在我尝试构建项目之前,它不会显示错误。

我想我在某处读到这两个名称空间未在新版本中实现。如果是这样,是否有其他方法可以做到这一点,或者我是否缺少依赖项或 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" ]
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    然后你创建虚拟上下文类

    public class MyDbContext : DbContext
    {
    }
    

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

    然后你写Startup.cs,它根据"appsettings.json"的内容构造Configuration属性。

    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,你可以在上下文中使用它,你可以使用

    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&lt;dynamic&gt;ExecuteReader/ExecuteReaderAsync 而不是DataTable(参见the answer 的代码),但这并不是那么重要。

    【讨论】:

    • 谢谢。这将使我走上正轨。但是,我在 options.UseSqlServer(Configuration["Data:MyDbConnectionString"]); 上的 startup.cs 文件中出现错误。它说在组件中定义的 DbContextOptionBuilder id 没有被引用谢谢。这将使我走上正轨。但是,我在 options.UseSqlServer(Configuration["Data:MyDbConnectionString"]); 上的 startup.cs 文件中出现错误。它说在组件中定义的 DbContextOptionBuilder id 没有被引用
    • @Dblock247:不客气! UseSqlServerEntityFramework.MicrosoftSqlServer 中定义。您应该验证using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Configuration; 是否存在于Startup.cs 中,并且project.json 包含足够的"dependencies" 回复到FF7。例如:"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final""EntityFramework.Commands": "7.0.0-rc1-final"
    • @Dblock247:我玩了一点,我想你应该把using Microsoft.Data.Entity;加到Startup.cs
    • 我还是有问题。我从一个空的 asp.net 5 应用程序开始,并尝试根据需要添加片段。即使它似乎与带有 mvc 的项目的配置相同,我也会收到错误消息。我已经发布了一个项目链接Here
    • @Dblock247:您应该在Startup.csDemoProject 中添加using Microsoft.Data.Entity;。库包应该只包含using Microsoft.Data.Entity; 和它的project.json 只包含"dependencies": { "EntityFramework.Core": "7.0.0-rc1-final" }, "frameworks": { "net451": { }, "dotnet5.4": { } }。此外,从project.jsonDemoProject删除对旧依赖项的引用 "EntityFramework.SqlServer": "7.0.0-beta8""Microsoft.Framework.ConfigurationModel": "1.0.0-beta4" 也很重要。经过以上改动,我就可以成功编译出你的解决方案了。
    【解决方案2】:

    你应该发布你的project.json

    引用System.Data 并删除project.json 中的dnxcore50 让我编译上面的代码:

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

    【讨论】:

      【解决方案3】:

      Oleg 的帖子很有帮助。看起来在最新版本中,如果您使用内置 DI,则 DbContext 将需要一个带有 DbContextOptions 的构造函数。有几种不同的风格,但你不能再有一个“虚拟的”空 DbContext 类了。

      https://docs.efproject.net/en/latest/miscellaneous/configuring-dbcontext.html

      【讨论】:

      • 请发布您的答案,然后是参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2020-05-09
      • 2018-03-25
      • 2021-11-13
      • 2018-12-01
      相关资源
      最近更新 更多