Azure Functions运行时2 - 使用SqlClient

时间:2018-04-10 07:41:38

标签: c# function azure azure-functions

无法将.Net SqlClient与运行时一起使用2.获取有关缺少引用的以下错误:

  

2018-04-09T13:48:51.172 [信息]编译失败。

     

2018-04-09T13:48:58.071 [信息]功能脚本   ' SqlExecutorActivity'改变。装载。

     

2018-04-09T13:48:58.363 [错误] run.csx(29,5):错误CS0246:类型   或命名空间名称' SqlConnectionStringBuilder'无法找到(是   你错过了使用指令或程序集引用?)

     

2018-04-09T13:48:58.376 [错误] run.csx(29,68):错误CS1069:类型   name' SqlConnectionStringBuilder'在命名空间中找不到   ' System.Data.SqlClient的&#39 ;.此类型已转发到程序集   ' System.Data.SqlClient,Version = 4.2.0.2,Culture = neutral,   公钥= b03f5f7f11d50a3a'考虑添加对它的引用   组装

     

2018-04-09T13:48:58.387 [错误] run.csx(71,28):错误CS0246:类型   或命名空间名称' AzureServiceTokenProvider'无法找到(是   你错过了使用指令或程序集引用?)

     

2018-04-09T13:48:58.396 [错误] run.csx(78,27):错误CS0246:类型   或命名空间名称' SqlConnection'无法找到(你错过了吗?   using指令或程序集引用?)

     

2018-04-09T13:48:58.417 [错误] run.csx(83,30):错误CS0246:类型   或命名空间名称' SqlCommand'无法找到(你错过了吗?   使用指令或程序集引用?)

#r "System.Data"
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Data.SqlClient;
using System.Collections.Generic;
public static async Task<string> Run(string requestData, TraceWriter log)
{
    dynamic data = JsonConvert.DeserializeObject<MaintQueueData>(requestData);
    log.Info($"Doing work in Server {data.Server}.");
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder["Server"] = data.Server;
    builder["Initial Catalog"] = data.Database;
    builder["Connect Timeout"] = 30;
    builder["Trusted_Connection"] = true;
    builder["Integrated Security"] = false;

    log.Info($"{builder.ConnectionString} ... HAHA no passwords br0ski!");

    var token = (String)null;
    var result = (String)null;

    try
    {
        token = await ADAuthentication.GetSqlTokenAsync();
    }catch(Exception e)
    {
        string error = $"Failed to authenticate with AAD: {e.Message}";
        log.Error($"{error}");
        return error;
    }

    try
    {
        result = await ExecuteInSql(builder.ConnectionString, token, data.Query);
    }catch(Exception e)
    {
        string error = $"Failed to execute SQL: {e.Message}";
        log.Error($"{error}");
        return error;
    }

    log.Info($"Query Complete: {data.Query}, Results: {result}");
    return $"Query Complete: {data.Query}, Results: {result}";
}
public static class ADAuthentication
{
    const String SqlResource = "https://database.windows.net/";

    public static Task<String> GetSqlTokenAsync()
    {
        var provider = new AzureServiceTokenProvider();
        return provider.GetAccessTokenAsync(SqlResource);
    }
}

private static async Task<String> ExecuteInSql(String connectionString, String token, String Query)
{
    using (var conn = new SqlConnection(connectionString))
    {
        conn.AccessToken = token;
        await conn.OpenAsync();
        String text = Query; 
        using (var cmd = new SqlCommand(text, conn))
        {
            var result = await cmd.ExecuteScalarAsync();
            return result as String;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我已在httptrigger中测试了您的代码并遇到了同样的问题。

但是,我注意到当运行时为&#34; beta &#34;时,它会加载using Microsoft.AspNetCore.Mvc;包。

如果您的项目平台是 .netcore it is not supported connect to Azure SQL server via AAD Authentication.

所以,我建议你可以尝试使用azure函数的运行时1来实现你想要的效果。

  

Azure Functions runtime 2.0处于预览状态,目前尚未支持Azure功能的所有功能。

此外,您可以使用Active Directory密码身份验证进行连接。

要使用集成身份验证和Azure AD身份连接到数据库,必须将数据库连接字符串中的Authentication关键字设置为Active Directory Integrated。以下C#代码示例使用ADO .NET。

string ConnectionString =
@"Data Source=n9lxnyuzhv.database.windows.net; Authentication=Active Directory Integrated; Initial Catalog=testdb;";
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();