首页 > 解决方案 > 使用脚本任务组件中的自定义代码将数据导出到 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)

标签: ssissql-server-data-toolsssis-2012azure-data-lakessis-2008

解决方案


推荐阅读