Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
A few people have asked for further information about the C# script task which I blogged about (quite a while ago). I mistakenly forgot to add the full source code, sorry everyone. Here is the link to the original blog post: https://blogs.msdn.com/benjones/archive/2009/03/29/using-a-c-script-task-in-ssis-to-download-a-file-over-http.aspx
I have since imported the SSIS package into Visual Studio 2010 (BIDS) and the code compiles without error. Some of the code below is truncated on the right (just a formatting issue I need to resolve) but the core of the code is there.
As always, let me know if there are any problems.
/*
Download a file over http using Script Task in SQL Server 2008 R2 Integration Services.
Two key variables, vSSOReportURL, which is constructed in a prior Script Task e.g. https://www..
vSSOLocalFileName, which is the fully qualified reference for the downloaded file e.g. c:\myfile.zip
*/
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Net;
using System.Net.Security;
namespace ST_7e897e41dd5945f3b77366d32f0a97e0.csproj
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
WebClient myWebClient;
string RemoteURI;
string LocalFileName;
bool FireAgain = true;
Variables vars = null;
Dts.VariableDispenser.LockForRead("User::vSSOReportURL");
Dts.VariableDispenser.LockForRead("User::vSSOLocalFileName");
Dts.VariableDispenser.LockForWrite("User::vSSOReportURLIndicator");
Dts.VariableDispenser.GetVariables(ref vars);
try
{
// Ignore certificate warnings
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(delegate { return true; });
// Initiate webclient download, use default credentials (current login)
myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;
RemoteURI = vars["User::vSSOReportURL"].Value.ToString();
LocalFileName = vars["User::vSSOLocalFileName"].Value.ToString();
// Log provider notification
Dts.Events.FireInformation(0, String.Empty, String.Format("Downloading '{0}' from '{1}'",
LocalFileName, RemoteURI), String.Empty, 0, ref FireAgain);
// Download the file
myWebClient.DownloadFile(RemoteURI, LocalFileName);
// Set report URL indicator, this is used to determine the http source of the
// download i.e. vSSOReportURL or vSSOReportURLRetry for the message which is
// written to the table
vars["User::vSSOReportURLIndicator"].Value = 0;
// Return success
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception ex)
{
// Catch and handle error
Dts.Events.FireError(0, String.Empty, ex.Message, String.Empty, 0);
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
}
}
The files are extracted using an Execute Process Task (with 7-Zip) as shown below:
And the arguments are set using the expression (below). There are probably better ways of doing this but I found this worked well.
The .zip file is then archived using a File System task and the extracted file is renamed to .xlsx.