我正在寻求从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& 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& connection) en System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 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(TaskCompletionSource1 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.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action
2操作,TInterceptionContext interceptionContext,Action3 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。<> c__DisplayClass1.b__0() en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func1 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.ObjectQuery1.<>c__DisplayClass7.<GetResults>b__5() en System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func
1次操作) en System.Data.Entity.Core.Objects.ObjectQuery1.GetResults(Nullable
1 forMergeOption) en System.Data.Entity.Core.Objects.ObjectQuery1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() en System.Data.Entity.Internal.LazyEnumerator
1.MoveNext() en System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable1 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](IEnumerable1 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
的使用是否正确?或者是否有另一种方法来访问连接字符串以访问数据库?
请帮助,我在这个话题上有点迷失。
提前致谢
答案 0 :(得分:0)
翻译成英文的错误意味着:
用户登录错误'NT AUTHORITY \ SYSTEM'。
不,翻译成英文的错误是
用户'NT AUTHORITY \ SYSTEM'登录失败。原因:无法打开 明确指定的数据库'CertusAccuro_dev'。
这意味着您的登录NT AUTHORITY\SYSTEM
未映射到此数据库,或者数据库不是ONLINE
。
第一个原因似乎是最有可能的,所以要修复它,你应该以{{1}}的身份连接到服务器并执行以下代码:
sysadmin