【问题标题】:There is no metadata information for provider 'SqlServer-20'提供程序“SqlServer-20”没有元数据信息
【发布时间】:2017-04-02 01:04:00
【问题描述】:

我想测试 Quartz.NET 3.0 for .NET Core 的 SQL 数据库功能。不幸的是,我无法正确配置StdSchedulerFactory,调用StdSchedulerFactory.GetScheduler时总是出现以下异常:

System.ArgumentOutOfRangeException: 
There is no metadata information for provider 'SqlServer-20'
Parameter name: providerName
   at Quartz.Impl.AdoJobStore.Common.DbProvider.GetDbMetadata(String providerName)
   at Quartz.Impl.AdoJobStore.Common.DbProvider..ctor(String dbProviderName, String connectionString)
   at Quartz.Impl.StdSchedulerFactory.<Instantiate>d__66.MoveNext()

我已使用以下值配置工厂:

var configuration = new NameValueCollection
{
    { "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
    { "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" },
    { "quartz.jobStore.tablePrefix", "QRTZ_" },
    { "quartz.jobStore.dataSource", "default" },
    { "quartz.dataSource.default.connectionString", "Server=(localdb)\\mssqllocaldb;Database=QuartzTest;Trusted_Connection=True;MultipleActiveResultSets=true" },
    { "quartz.dataSource.default.provider", "SqlServer-20" },
    { "quartz.jobStore.useProperties", "true" },
    { "quartz.serializer.type", "json" }
};

var schedulerFactory = new StdSchedulerFactory(configuration);

如您所见,我目前的目标是 LocalDB (v12.0.2000)。我还在 SQL Server Express 上检查了它——结果相同。

如何避免此异常?

  • 我是否错过了我应该配置的任何属性?
  • 我必须为数据库提供一些数据吗?我只执行了tables_sqlServer.sql 脚本。
  • SqlServer-20 数据库驱动程序应作为 .NET 3.5 的一部分安装,还是需要单独安装?
  • Quartz.NET 当前是否不支持 .NET Core 的此功能?我使用的是 3.0.0-alpha2 版本。
  • 我应该以其他 NuGet 包为目标吗?我引用了 Quartz 和 Quartz.Serialization.Json

【问题讨论】:

    标签: c# .net sql-server .net-core quartz.net


    【解决方案1】:

    目前根据 beta1 的变更日志,没有提供程序的版本。因此,SqlServer 的正确提供程序配置是:

    ["quartz.dataSource.sqlserver.provider"] = "SqlServer"
    

    来源:https://github.com/quartznet/quartznet/blob/e3ff6936ea1a76480b7671e2b5c468c1b67f4897/changelog.md#release-30-beta-1-oct-8-2017

    【讨论】:

      【解决方案2】:

      我的一个朋友刚刚找到了答案:根据this example on Github,您必须在.NET Core 项目中使用SqlServer-41 而不是SqlServer-20

      【讨论】:

      【解决方案3】:
      // Grab the Scheduler instance from the Factory
                  NameValueCollection properties = new NameValueCollection
                  {
                      { "quartz.serializer.type", "binary" }
                  };
                  properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
                  properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
                  properties["quartz.jobStore.dataSource"] = "default";
                  properties["quartz.dataSource.default.connectionString"] = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=quartznet;Data Source=.\\sqlInstance;";
                  properties["quartz.dataSource.default.provider"] = "SqlServer";
                  properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
                  properties["quartz.jobStore.useProperties"] = "true";
                  properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
      
                  StdSchedulerFactory factory = new StdSchedulerFactory(properties);
                  IScheduler scheduler = await factory.GetScheduler();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 2016-04-17
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多