ssis - 使用脚本任务组件中的自定义代码将数据导出到 Azure Data Lake Store
问题描述
我需要帮助。我正在尝试通过将结果集转换为流来将数据导出到 ADLS。
当我使用控制台应用程序尝试此操作时,不会引发任何错误,但是当我将其与脚本任务集成时,请在此处输入代码组件它在运行时引发错误。此外,在添加 Azure 类后,调试时断点未命中。
using System;
using System.Threading;
using Microsoft.Azure.Management.DataLake.Store;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest.Azure.Authentication;
using System.IO;
using System.Data.SqlClient;
using System.Data;
using System.Text;
public class Program {
private static string adlsAccountName;
private static string tblName = "tblGrid";
DataTable dataTable = new DataTable();
public byte[] datared()
{
string connectionString = "Data Source=local;Initial Catalog=abc;Integrated Security=True";
string query = "select * from " + tblName;
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);
conn.Close();
da.Dispose();
var a = Encoding.GetEncoding("iso-8859-1").GetBytes(ToByte(dataTable));
return a;
}
public static string ToByte(DataTable table)
{
var result = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(table.Columns[i].ColumnName);
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(row[i].ToString());
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
}
return result.ToString();
}
public static void Main()
{
Program p = new Program();
var bytes = p.datared();
MemoryStream stream = new MemoryStream(bytes);
// Name of the Azure Data Lake Store
var adlsAccountName = "testadls08";
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
// Portal > Azure AD > Properties > Directory ID (aka Tenant ID)
var domain = "177cfeea-xxxx-xxx-853d-xxxx";
// Portal > Azure AD > App Registrations > App > Application ID (aka Client ID)
var clientId = "0e499fed-7f23-4b19-98ab-xxxxx";
// Portal > Azure AD > App Registrations > App > Settings > Keys (aka Client Secret)
var clientSecret = "6xxxxxxxxxxxxxxxxxxxxxxxx=";
var clientCredential = new ClientCredential(clientId, clientSecret);
var creds = ApplicationTokenProvider.LoginSilentAsync(domain, clientCredential).Result;
var filepath = "/shared/" + tblName + ".txt";
var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);
adlsFileSystemClient.FileSystem.Create(adlsAccountName, filepath, overwrite: true);
adlsFileSystemClient.FileSystem.Append(adlsAccountName, filepath, stream);
}
}
调用的目标已引发异常。
在 System.Reflection.RuntimeMethodInfo 的 System.RuntimeMethodHandle.InvokeMethod(对象目标,Object[] 参数,签名 sig,布尔构造函数)。
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) 在 System.RuntimeType 的 UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)。
Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 处的 InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)