使用LocalDb配置Quartz的AdoJobStores

时间:2015-07-29 18:09:54

标签: c# quartz.net localdb

我已经将Quartz AdoJobStores与SQL Server一起使用了很长时间没有任何问题。最近我将SQL Server数据库更改为LocalDB数据库并收到以下异常:

Quartz.JobPersistenceException: Couldn't obtain job names: Invalid object name 'QRTZ_JOB_DETAILS'.
System.Data.SqlClient.SqlException: Invalid object name 'QRTZ_JOB_DETAILS'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at Quartz.Impl.AdoJobStore.StdAdoDelegate.SelectJobsInGroup(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher) 
at Quartz.Impl.AdoJobStore.JobStoreSupport.GetJobNames(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher)

这是我的App.config上的Quartz配置部分:

<quartz>
<add key="quartz.scheduler.instanceName" value="RemoteServer" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="9999" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />
<add key="quartz.scheduler.instanceId" value="instance_one" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.dataSource.default.connectionString" value="Data Source=(localdb)\v11.0; Initial Catalog=Scheduling;MultipleActiveResultSets=true;Integrated Security=SSPI" />
<add key="quartz.dataSource.default.provider" value="SqlServer-20" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />

数据库存在,我可以使用Navicat连接到它,但是没有任何表是空的。我想也许我可以成为数据库提供者并阅读页面Quartz.NET - Lesson 9: JobStores我发现这些是可用的数据库提供者:

  
      
  • SqlServer-20 - .NET Framework 2.0的SQL Server驱动程序
  •   
  • OracleODP-20 - Oracle的Oracle驱动程序
  •   
  • OracleODPManaged-1123-40 Oracle的Oracle 11托管驱动程序
  •   
  • OracleODPManaged-1211-40 Oracle的Oracle 12托管驱动程序
  •   
  • MySql-50 - MySQL Connector / .NET v.5.0(.NET 2.0)
  •   
  • MySql-51 - MySQL Connector /:NET v.5.1(.NET 2.0)
  •   
  • MySql-65 - MySQL Connector /:NET v.6.5(.NET 2.0)
  •   
  • SQLite-10 - SQLite ADO.NET 2.0 Provider v.1.0.56(.NET 2.0)
  •   
  • Firebird-201 - Firebird ADO.NET 2.0提供商v.2.0.1(.NET 2.0)
  •   
  • Firebird-210 - Firebird ADO.NET 2.0 Provider v.2.1.0(.NET 2.0)
  •   
  • Npgsql-20 - PostgreSQL Npgsql
  •   

问题

  1. 我可以将LocalDB数据库与SQLServerDelegate一起使用吗?
  2. 问题是因为Quartz没有LocalDB的提供程序?

1 个答案:

答案 0 :(得分:1)

如果通过SSMS(Sql Server Management Studio)连接到“(localdb)\ v11.0”...您可以创建一个新的db(例如QuartzDB)。然后运行脚本来创建它。

我通过此谷歌搜索找到了脚本

https://www.google.com/?gws_rd=ssl#q=%22CREATE+TABLE+[dbo].[QRTZ_CALENDARS]%22

这是我发现的一个:

https://raw.githubusercontent.com/quartznet/quartznet/master/database/tables/tables_sqlServer.sql

或者这个:

http://svn.terracotta.org/svn/quartz/tags/quartz-2.1.5/docs/dbTables/tables_sqlServer.sql

我认为您可以使用SqlServer-20对该数据库使用石英库。注意,对于每个版本的sql-server都不存在提供者,'SqlServer-20'适用于“最小公分母”类型的多个版本的sql-server。

我认为最重要的是......石英库不会创建表/ DDL,它使用已经创建的DDL。