我在 SSIS (2008) 包中有一个脚本任务,用于将文件从远程 FTP 服务器下载到本地目录。脚本任务是用 C# 2008 编写的,并使用 WinSCPnet.dll。使用 WinSCP 文档中的示例,我想出了下面的脚本。该脚本可以正确下载文件,但所有文件成功/失败消息都会保留,直到整个脚本完成,然后所有消息都会立即转储。使用时根本不显示文件进度Console.Write()
,并尝试使用Dts.Events.FireInformation()
in SessionFileTransferProgress
给我
Error: "An object reference is required for the non-static field, method, or property Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase.Dts.get"
有没有办法使用 DTS.events.Fire* 事件来显示文件发生时的进度信息以及每个文件后的文件完成状态?
Script:
/*
Microsoft SQL Server Integration Services Script Task
Write scripts using Microsoft Visual C# 2008.
The ScriptMain is the entry point class of the script.
*/
using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Tasks.ScriptTask;
using System.AddIn;
using WinSCP;
namespace ST_3a1cf75114b64e778bd035dd91edb5a1.csproj
{
[AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : VSTARTScriptObjectModelBase
{
public void Main()
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = (string)Dts.Variables["User::FTPServerName"].Value,
UserName = (string)Dts.Variables["User::UserName"].Value,
Password = (string)Dts.Variables["User::Password"].Value
};
try
{
using (Session session = new Session())
{
// Will continuously report progress of transfer
session.FileTransferProgress += SessionFileTransferProgress;
session.ExecutablePath = (string)Dts.Variables["User::PathToWinSCP"].Value;
// Connect
session.Open(sessionOptions);
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult = session.GetFiles(
(string)Dts.Variables["User::ExportPath"].Value
, (string)Dts.Variables["User::ImportPath"].Value
, false
, transferOptions
);
// Throw on any error
transferResult.Check();
// Print results
bool fireAgain = false;
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Dts.Events.FireInformation(0, null,
string.Format("Download of {0} succeeded", transfer.FileName),
null, 0, ref fireAgain);
}
}
Dts.TaskResult = (int)DTSExecResult.Success;
}
catch (Exception e)
{
Dts.Events.FireError(0, null,
string.Format("Error downloading file: {0}", e),
null, 0);
Dts.TaskResult = (int)DTSExecResult.Failure;
}
}
private static void SessionFileTransferProgress(object sender, FileTransferProgressEventArgs e)
{
//bool fireAgain = false;
// Print transfer progress
Console.Write("\r{0} ({1:P0})", e.FileName, e.FileProgress);
/*Dts.Events.FireInformation(0, null,
string.Format("\r{0} ({1:P0})", e.FileName, e.FileProgress),
null, 0, ref fireAgain);*/
// Remember a name of the last file reported
_lastFileName = e.FileName;
}
private static string _lastFileName;
}
}