尝试从Windows服务

时间:2017-11-24 02:31:09

标签: c# sql-server windows-services

我正在寻求从Windows服务访问数据库,我在解决方案中有几个项目。 Win服务本身启动一个计时器,每隔X秒执行一次操作。此操作位于类库(Business)中,后者又可以访问访问数据库的DAL层(在另一个库类中)。

我通常使用这种方案来访问数据库中的数据,特别是在这种特殊情况下,我的用户界面是一个Windows服务。此服务具有app.config文件,您可以在其中定义数据库的连接字符串。

我已在另一个项目(Winforms)中验证连接字符串是否正常工作(它从数据库返回数据)。要安装服务,请在同一解决方案中生成安装程序。

所有这些编译没有问题。并且服务安装正确,但是当我启动时,它告诉我每次使用上述方法进入数据库时​​,计时器正在运行。

我的问题是,当我访问时,我收到一条消息,告诉我无法访问数据库。这是消息

  

System.Data.DataException:初始化数据库时发生异常。有关详细信息,请参阅InnerException。

     

System.Data.Entity.Core.EntityException:底层提供程序在Open上失败。

     

System.Data.SqlClient.SqlException:No se puede abrir la base de datos“CertusAccuro_dev”solicitada por el iniciodesesión。错误de iniciodesesión。
  错误de iniciodesesióndelusuario'NT AUTHORITY \ SYSTEM'。

     

en System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal&amp; connection)          en System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) en System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource 1 retry,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal&amp; connection)          en System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource 1 retry, DbConnectionOptions userOptions) en System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 retry,DbConnectionOptions userOptions)          zh_cn System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource 1 retry) en System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1重试)          en System.Data.SqlClient.SqlConnection.Open()          en System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.b__36(DbConnection t,DbConnectionInterceptionContext c)          en System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action 2操作,TInterceptionContext interceptionContext,Action 3 executing, Action 3执行)          en System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection,DbInterceptionContext interceptionContext)          en System.Data.Entity.Core.EntityClient.EntityConnection.b__2()          en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy。&lt;&gt; c__DisplayClass1.b__0()          en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func 1 operation) en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) en System.Data.Entity.Core.EntityClient.EntityConnection.Open() --- Fin del seguimiento de la pila de la excepción interna --- en System.Data.Entity.Core.EntityClient.EntityConnection.Open() en System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions) en System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func 1 func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)          en System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.<GetResults>b__5() en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1次操作)          en System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption)          en System.Data.Entity.Core.Objects.ObjectQuery 1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() en System.Data.Entity.Internal.LazyEnumerator 1.MoveNext()          en System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable 1 source) en System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable 1序列)          en System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle [TResult](IEnumerable 1 query, Expression queryRoot) en System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression) en System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression) en System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 source)          en System.Data.Entity.Internal.EdmMetadataRepository.QueryForModelHash(Func`2 createContext)          en System.Data.Entity.Internal.InternalContext.QueryForModelHash()          en System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext,ModelHashCalculator modelHashCalculator,Boolean throwIfNoMetadata,DatabaseExi

翻译成英文的错误意味着:

  

用户登录错误'NT AUTHORITY \ SYSTEM'。

Windows服务中app.config的使用是否正确?或者是否有另一种方法来访问连接字符串以访问数据库?

请帮助,我在这个话题上有点迷失。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

翻译成英文的错误意味着:

     

用户登录错误'NT AUTHORITY \ SYSTEM'。

不,翻译成英文的错误是

  

用户'NT AUTHORITY \ SYSTEM'登录失败。原因:无法打开   明确指定的数据库'CertusAccuro_dev'

这意味着您的登录NT AUTHORITY\SYSTEM未映射到此数据库,或者数据库不是ONLINE

第一个原因似乎是最有可能的,所以要修复它,你应该以{{1​​}}的身份连接到服务器并执行以下代码:

sysadmin