【问题标题】:dotNet core (console app) with Enterprise Library Data (EnterpriseLibrary.Data.NetCore) and JSON带有企业库数据 (EnterpriseLibrary.Data.NetCore) 和 JSON 的 dotNet 核心(控制台应用程序)
【发布时间】:2018-11-12 13:28:14
【问题描述】:

我正在尝试使用:

EnterpriseLibrary.Data.NetCore

.nuget\packages\enterpriselibrary.data.netcore\6.0.1313

https://www.nuget.org/packages/EnterpriseLibrary.Data.NetCore/

.NET Core 2.1

我有以下 JSON

{
  "ConnectionStrings": {
    "MyDefaultConnectionName": "Server=.\\MyInstance;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

并且这段代码工作正常(在我的 Program.cs dotnet 控制台应用程序中)(简单显示我的 appsettings.json 正在被拾取,看起来我的连接字符串 json 结构看起来正确。

using Microsoft.Extensions.Configuration;

            IConfiguration config = new ConfigurationBuilder()
                    .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .Build();


            string conString = Microsoft
               .Extensions
               .Configuration
               .ConfigurationExtensions
               .GetConnectionString(config, "MyDefaultConnectionName");

            Console.WriteLine("MyDefaultConnectionName.conString='{0}'", conString);

我明白了:

MyDefaultConnectionName.conString='Server=.\MyInstance;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true'

但是,我尝试使用该代码失败了:

using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;
using System.Data.Common;

    public DataSet GetADataSet()
    {
        DataSet returnDs = null;
        string sql = "Select * from dbo.MyTable";

        try
        {

            DatabaseProviderFactory factory = new DatabaseProviderFactory();
            Database db = DatabaseFactory.CreateDatabase("MyDefaultConnectionName");
            DbCommand dbc = db.GetSqlStringCommand(sql);
            returnDs = db.ExecuteDataSet(dbc);
        }
        catch (Exception ex)
        {
            string temp = ex.Message;
            throw ex;
        }

        return returnDs;
    }

例外是:

运行'Select * from dbo.MyTable' ('MyDefaultConnectionName') ('Database provider factory not set for the static DatabaseFactory. 设置提供者工厂调用 DatabaseFactory.SetProviderFactory 方法或通过调用 DatabaseFactory 指定自定义映射时出现异常.SetDatabases 方法。')

我找到了这个链接....

Microsoft.Practices.EnterpriseLibrary.Data.DLL but was not handled in user code

到“旧的”基于 dotnet 核心 xml 的版本。

我也做过项目网站

https://github.com/Chavoshi/EnterpriseLibrary.NetCore

但找不到工作示例

..... 关于我上面的代码行:

DatabaseProviderFactory myFactory= new DatabaseProviderFactory();

以及错误信息:

DatabaseFactory.SetProviderFactory

myFactory 没有方法 SetProviderFactory

........

我试过这个...(但我知道它确实与 xml 属性不一样(未来的读者,不要在下面的 json 上浪费你的时间)

{
  "ConnectionStrings": {
    "MyDefaultConnectionName": "Server=.\\MyInstance;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true",
    "providerName": "System.Data.SqlClient"
  }
}

什么是神奇的语法糖使用

https://github.com/Chavoshi/EnterpriseLibrary.NetCore

使用 dotnet 核心控制台应用程序?使用 JSON

追加:

基于cmets,我也追过这个例子:

https://github.com/Chavoshi/EnterpriseLibrary.NetCore/tree/master/Examples

一个例子是基于 xml,而不是基于 json。

【问题讨论】:

  • 你检查example code了吗?
  • @DavidG。这有点帮助。我看到有些方法是静态方法,而不是实例方法。但现在我得到:数据库“DefaultConnection”的连接字符串不存在或没有有效的提供者。请参阅我的“未来读者”,在那里我尝试找到在 json 中设置 providerName 的方法,就像在 xml 中所做的那样。
  • @DavidG .. 你给出的例子....有点帮助。我指出该示例是基于 xml 的。查看兄弟文件:github.com/Chavoshi/EnterpriseLibrary.NetCore/blob/master/…
  • 是的,几天前我确实看到了那个例子。 (在:github.com/Chavoshi/EnterpriseLibrary.NetCore/tree/master/… 给出的单个示例)它是基于 xml 的。这才是主要问题,让世界快乐的~json~魔法酱是什么。
  • 那不是微软的企业图书馆数据访问组件,那是某人的带有克隆代码和文本的仓库。你为什么首先使用它?当 ADO.NET 2.0 出现时,contained almost all of the old EntLib's data access patterns。结果,Entlib Data 被放弃了。为什么在 ADO.NET 提供自己的DbProviderFactories.GetFactory(providerName); 等时使用DatabaseFactory.CreateDatabase

标签: c# .net-core enterprise-library


【解决方案1】:

感谢大家的解释。正如@panagiotis-kanavos 在 cmets 中也提到的那样,向库中添加 JSON 支持是一项重大更改,需要付出很多努力,而且我肯定无法单独完成。

顺便说一句,我将以某种方式启动Enterprise Library Community 并让它再次活跃起来——因为我一直(现在)一直是它的粉丝,因为我个人认为它真的很方便,特别是在 异常处理 strong> 和 Logging 块-因此绝对添加 JSON 支持将是新主要版本中的第一个更改。

但是现在这个项目只是为了帮助那些想要将他们的旧项目转换为 .Net Core 的人,挑战更少,而不需要改变基础设施。

最后,如果有人能在社区中帮助我,我将不胜感激,因为我已经开始与 Microsoft 讨论这个主题并等待他们决定让我用新版本更新官方软件包,以防万一继续更新库。

【讨论】:

  • 感谢您的参与!是的,即使在使用“更酷的玩具”这么多年之后,我仍然喜欢 EnterprieLibrary.Data 的紧凑性。 AddParameter、AddParameter 和 Execute 语法糖。
  • MohammadC,你可能对我的帖子感兴趣:stackoverflow.com/questions/40845542/…
【解决方案2】:

有办法做到这一点。

这是我的 appsettings.json

{

  "APP": {
    "APP_NAME": "EOD.BACKUP.JOB",
    "APP_AUTHOR": "Lutaaya Fauzi"
  },

  "LOGGING": {
    "LOG_FILE_EXXT": "log",
    "LOG_FILE_PRFX": "DailyEODBackUp",
    "LOG_FILE_PATH": "D:\\109\\APP_LOGS\\EODDataBackUpJob"
  },

  "DATABASE_PROVIDERS": {
    "ODBC": "System.Data.Odbc",
    "MSSQL": "System.Data.SqlClient"
  },

  "DATABASE": {
    "XVERSEDB": {
      "DBMS": "ORACLE",
      "CONN_STRING": "Dsn=XEPDB1; Pwd=XVERSE",
      "DSN": "XEPDB1",
      "PWD": "XVERSE"
    },
    "E4MDB": {
      "DBMS": "ORACLE",
      "CONN_STRING": "Dsn=XEPDB1_E4M; Pwd=E4M",
      "DSN": "XEPDB1_E4M",
      "PWD": "E4M"
    },
    "LIVEEXIMSUPPORTDB": {
      "DBMS": "MSSQL",
      "CONN_STRING": "Data Source=DESKTOP-NL8PUQI\\SQLEXPRESS;Initial Catalog=LIVEEXIMSUPPORTDB;User ID=sa;Password=bundestag",
      "DATA_SOURCE": "DESKTOP-NL8PUQI\\SQLEXPRESS",
      "DATABASE": "LIVEEXIMSUPPORTDB",
      "USER": "XEPDB1",
      "PASSWORD": "XVERSE"
    }

  }

}

这是我的 DBOperations.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EODDataBackUpJob
{
    internal class DBOperations
    {
        #region ... VARIABLES
        // ... configuration
        IConfiguration appconfig = new ConfigurationBuilder().AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();
        ApplicationLogger applogger = new ApplicationLogger();
        private Database XVERSEDB, EXIMDB, E4MDB;
        private DbCommand mycommand;
        #endregion


        #region ... Database Connection
        public DBOperations()
        {
            try
            {
                #region ... Register Database Factories
                string ODBC_PROVIDER = appconfig["DATABASE_PROVIDERS:ODBC"];
                string MSSQL_PROVIDER = appconfig["DATABASE_PROVIDERS:MSSQL"];

                DbProviderFactories.RegisterFactory(ODBC_PROVIDER, OdbcFactory.Instance);
                DbProviderFactories.RegisterFactory(MSSQL_PROVIDER, SqlClientFactory.Instance);

                DbProviderFactory ODBC_FACTORY_PROVIDER = DbProviderFactories.GetFactory(ODBC_PROVIDER);
                DbProviderFactory MSSQL_FACTORY_PROVIDER = DbProviderFactories.GetFactory(MSSQL_PROVIDER);
                #endregion



                // ... XVERSEDB
                string XVERSEDB_CONN = appconfig["DATABASE:XVERSEDB:CONN_STRING"];
                XVERSEDB = new GenericDatabase(XVERSEDB_CONN, ODBC_FACTORY_PROVIDER);

                // ... EXIMDB
                string EXIMDB_CONN = appconfig["DATABASE:LIVEEXIMSUPPORTDB:CONN_STRING"];
                EXIMDB = new GenericDatabase(EXIMDB_CONN, MSSQL_FACTORY_PROVIDER);

                // ... E4MDB
                string E4MDB_CONN = appconfig["DATABASE:E4MDB:CONN_STRING"];
                E4MDB = new GenericDatabase(E4MDB_CONN, ODBC_FACTORY_PROVIDER);
           

            }
            catch (Exception ex)
            {
                string msg = ex.Message;
                string stack_trace = ex.StackTrace;
                applogger.LogToFile("DBOperations.DBOperations", msg);
                applogger.LogToFile("DBOperations.DBOperations", stack_trace);
                applogger.LogFileSeparator();
            }
        }
        #endregion


        #region ... oracle DB 
        public void ExecuteDBReport()
        {
            try
            {
                DataTable result = new DataTable();

                ////mycommand = XVERSEDB.GetStoredProcCommand("UATJUN.SP_NPA_MANUAL_PROCESS", "28/02/2022", "");
                //XVERSEDB.ExecuteDataSet(mycommand);

                mycommand = E4MDB.GetSqlStringCommand("SELECT * FROM E4M.CFG_BILLER");
                mycommand.CommandTimeout = 5000;
                result = E4MDB.ExecuteDataSet(mycommand).Tables[0];

            }
            catch (Exception ex)
            {
                string msg = ex.Message;
                string stack_trace = ex.StackTrace;
                applogger.LogToFile("DBOperations.ExecuteDBReport", msg);
                applogger.LogToFile("DBOperations.ExecuteDBReport", stack_trace);
                applogger.LogFileSeparator();
            }
        }
        #endregion



    }
}

此示例涵盖 通过 ODBC 数据源连接 Oracle 数据库以及 通过 ODBC 数据源连接 MSSQL

您现在可以申请其他数据库,例如 MySQL

它应该适用于 .NET 核心

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2018-05-14
    • 1970-01-01
    • 2019-09-26
    • 2011-01-21
    相关资源
    最近更新 更多