我在 SQL Server 2008 R2 中创建了一个多步骤 SSIS 包,该包在集成服务中的 DTS 包下启动时运行良好,但在涉及将 Excel 文件复制到 SharePoint 文件夹的步骤中调用 SQL Server 代理作业时失败在服务器上创建。在包中,Run64bitRuntime 设置为 False,当在作业的一个步骤中调用包时,在执行选项下选中“使用 32 位运行时”。这适用于从位于其他 SharePoint 文件夹中的 Excel 文件中读取信息的其他 SSIS 包。这里的独特之处在于我现在正尝试将在服务器上创建的 Excel 文件复制到 SharePoint 文件夹。如果不是因为 Excel 文件的格式和内容不统一,我会改用 SSRS。
这是我选择 SQL Server 代理作业的“查看历史记录”时返回的错误消息。
日期 2013 年 1 月 29 日下午 3:13:47 记录作业历史记录(数据拉取)
步骤 ID 1 服务器 xxxx-xxx-xx 作业名称 数据拉取步骤名称 运行 xxxx_Extractxxx 持续时间 00:16:13 Sql Severity 0 Sql Message ID 0 Operator Emailed Operator Net sent Operator Paged Retries Attempted 0
信息
以用户身份执行:CABLE!svcnvdeautomation。适用于 32 位的 Microsoft (R) SQL Server 执行包实用程序版本 10.50.1600.1 版权所有 (C) Microsoft Corporation 2010。保留所有权利。
开始时间:下午 3:13:47 错误:2013-01-29 15:30:00.01 代码:0x00000001 源:创建 Excel 文件 描述:System.Reflection.TargetInvocationException:调用目标已引发异常。---> System.Runtime.InteropServices.COMException (0x800A03EC):来自 HRESULT 的异常:Microsoft.Office.Interop.Excel.WorkbookClass.SaveAs 的 0x800A03EC(对象文件名,对象文件格式,对象密码,对象 WriteResPassword,对象 ReadOnlyRecommended,对象 CreateBackup , XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local) at ST_87e8d62a054b4e16b60297154afc19d8.csproj.ScriptMain.Main() --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target ,
在 System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags,Binder binder,Object target,Object[] providedArgs,ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams)在 System.Type.InvokeMember(String name,BindingFlags invokeAttr, Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 处的 Binder binder、Object 目标、Object[] args、CultureInfoculture) End Error DTExec:包执行返回 DTSER_FAILURE (1)。开始时间:下午 3:13:47 结束时间:下午 3:30:00 经过时间:972.573 秒。包执行失败。步骤失败。
如果有帮助,下面列出的是用于复制 Excel 文件的代码。
public void Main()
{
SharePointListsService.Lists listService = new SharePointListsService.Lists();
listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Create variable with format of "2012-11-28"
string DateTimeNow = DateTime.Now.ToString("yyyy") + "-" + DateTime.Now.ToString("MM") + "-" + DateTime.Now.ToString("dd");
// Check out the file as defined in SharePoint.
string fileCheckout = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
bool myResults = listService.CheckOutFile(fileCheckout, "true", DateTime.Now.ToString("f"));
// Full file name including path and extension
// "D:\Work area\Reports\Project.xls"
string FullFileName = Dts.Variables["User::ReportsExcelFileName"].Value.ToString();
// File Name without path and extension
// "Project"
string FileName = GetFileNameWithoutExtFromPath(FullFileName);
// Path only
// "D:\Work area\Reports\"
string Path = GetDirFromPath(FullFileName);
// From the source file (FullFileName) assemble the [Path] and [Filename] of new file copy that includes a specific date format attached to new file name.
// "D:\Work area\Reports\Project 2012-11-28.xls"
File.Copy(FullFileName, (Path + "\\" + FileName + " " + DateTimeNow + ".xls"), true);
// Get UNC Folder path
// "\\xx.yy.com\Shared Documents\Data Pulls" string UNCFolder = Dts.Variables["UNCFolder"].Value.ToString();
// Get File name as it appears in the Reports folder
string ReportsExcelFile = FullFileName;
// Copy the Excel file from the Reports directory to the SharePoint UNC folder location
File.Copy(ReportsExcelFile, (UNCFolder + "\\" + FileName + ".xls"), true);
//Check in
//string fileCheckin = Dts.Variables["User::URLFolder"].Value.ToString();
string fileCheckin = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
myResults = listService.CheckInFile(fileCheckin, "Completed revision.", "0");
Dts.TaskResult = (int)ScriptResults.Success;
}
public String GetFileNameWithoutExtFromPath(String path)
{
try
{
String filename = path.Substring(path.LastIndexOf("\\") + 1);
int pos = filename.LastIndexOf(".");
if (pos != -1)
return filename.Substring(0, pos);
else
return filename;
}
catch (Exception)
{
// error
return "";
}
}
public String GetDirFromPath(String path)
{
try
{
return path.Substring(0, path.LastIndexOf("\\") + 1);
}
catch (Exception)
{
// error
return "";
}
}
在 SQL Server 配置管理器下,我已将 SQL Server 代理设置为应用具有网络访问权限的登录,其他作业正在调用其他 SSIS 包成功应用该登录。此外,在服务器上的 Componet 服务下,我转到了我的电脑,右键单击并选择属性,这会打开带有六个选项卡的我的电脑属性框。我选择了 COM 安全选项卡并编辑了访问权限以及启动和激活权限的编辑限制。在每个我添加了网络服务。对于访问权限,我检查了允许本地访问,对于启动和激活权限,我选择了本地启动和本地激活。
鉴于上述详细信息,有人可以帮助我确定为什么 SSIS 包在 SQL Server 代理下运行时复制 Excel 文件的步骤继续失败?