【发布时间】:2017-03-17 11:06:23
【问题描述】:
我有一个运行脚本任务的 SSIS 包(主要是,还有一些其他的东西)。脚本任务使用 OleDB 连接连接到 Access 数据库。这是 Microsoft Jet 4.0 连接。我已经安装了驱动程序。但它不会通过代理帐户在 SQL 代理中运行。它将直接从 Visual Studio 和包商店正常运行。事实上,当我以代理绑定的特殊帐户登录时,它在这两个地方都运行良好。但是当我通过 SQL Server 代理运行时,我得到了可怕的“未指定错误”OleDbException。
脚本任务的相关代码:
// class field
private string accessConnectionStringTemplate = "Data Source=\"{0}\";Provider=Microsoft.Jet.OLEDB.4.0;";
// in method that connects to database
Print(file, "Connection string: " + string.Format(accessConnectionStringTemplate, file.FileName));
// outputs: Data Source = "\Path\To\File";Provider=Microsoft.Jet.OLEDB.4.0"
using(access = new OleDbConnection(string.Format(accessConnectionStringTemplate, file.FileName))) {
access.Open();
// other code
}
通过 SQL 代理作业历史记录的错误消息:
Started: 12:35:10 PM
Error: 2016-11-03 12:35:33.51
Code: 0x00000000
Source: Import Files Main
Description: Exception: Unspecified error
End Error
Error: 2016-11-03 12:35:33.51
Code: 0x00000000
Source: Import Files Main
Description: at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.ImportFile(AccessFile file, DateTime startRecordDate, DateTime endRecordDate, List`1 accessTables, Boolean includeTransactionTables, List`1 specifiedTableList)
at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.Main()
End Error
Error: 2016-11-03 12:35:33.51
Code: 0x00000006
Source: Import Files
Description: The script returned a failure result.
End Error
我已经确定的一些事情:
- Access 驱动程序已安装并在 SQL 代理所在的服务器上运行。我通过在 VS 中作为我的帐户和代理的帐户运行包来验证这一点,没有任何问题。
- 代理帐户有权访问相关文件。同样,通过以代理帐户登录服务器进行验证。该文件位于网络共享上,但路径被指定为 UNC 路径。
- 代理帐户有权访问属于此操作的其他数据库,以排除任何其他潜在的错误来源。
- 从包存储运行包(通过 SSMS),因为我的帐户和代理的帐户都有效。我在数据库服务器上执行此操作以确保。
在我在互联网上看到的其他问题中,这通常是驱动程序的问题。在这种情况下,我不确定它是怎么回事。
我很乐意提供更多信息来帮助其他诊断。我自己完全不确定为什么这不起作用。
【问题讨论】:
-
奇怪,文件是否以任何方式打开或锁定?
-
@Siyual:不是。而且由于我能够在 SQL 代理之外运行它,所以这似乎不是问题。我想可能有人在我运行代理作业时打开了它,而在其他任何时候都没有,但这似乎不太可能。
-
嗯 - 这是一个赃物:名义上,连接字符串参数是用分号分隔的,不喜欢参数周围的引号 - 即使是带有嵌入空格的参数。试着把引号去掉。这不是一个踢球者吗?
-
您是否尝试过更改
BufferTEMPstorage路径和BlobTempstoragepath。 sqlserverscribbles.com/2013/05/07/… ? -
@p2k:在 C:\Users\SQLSERVERAGENT\AppData\Local\Temp 目录中授予我的代理帐户权限确实允许它运行。然而,这感觉就像一个黑客。我没有数据流任务,因此无法更改这些变量(它们似乎不存在于脚本任务中)。
标签: sql-server ssis oledb sql-agent