在MVC 6下使用ADO.NET替代DataTable是什么?

Dbl*_*247 5 ado.net c#-5.0 asp.net-core-mvc

我正在创建一个MVC 6项目,我宁愿使用Classic ADO.net而不是实体框架7.但是,它说两个DataTable和两个都找不到名称空间SqlDataAdapter.我有一个使用System.DataSystem.Data.SqlClient声明.在我尝试构建项目之前,它不显示错误.

我想我在某处看到这两个名字空间没有在新版本中实现.如果是这样,有另一种方法可以做到这一点,还是我错过了依赖或使用声明?

码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我的project.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" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我最终尝试了很多不同的组件,试图让它得到遵守.如果有使用参考,请告诉我.

Ole*_*leg 4

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

另一方面,实体框架包含执行行 SQL 查询并将结果保存在对象中而不使用实体的方法。我在答案里发帖了中发布了代码片段,可以使用。我很快就想起了这个想法。

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

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

然后创建虚拟上下文类

public class MyDbContext : DbContext
{
}
Run Code Online (Sandbox Code Playgroud)

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

然后根据 的内容编写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"]);
            });
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在您已经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);
}
Run Code Online (Sandbox Code Playgroud)

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