Azure Functions 运行时 2 - 使用 SqlClient 的 SQL 连接

Posted

技术标签:

【中文标题】Azure Functions 运行时 2 - 使用 SqlClient 的 SQL 连接【英文标题】:Azure Functions runtime 2 - SQL Connections using SqlClient 【发布时间】:2018-04-10 07:41:38 【问题描述】:

无法在运行时使用 .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' 找不到(是 您缺少 using 指令或程序集引用?)

2018-04-09T13:48:58.376 [错误] run.csx(29,68): 错误 CS1069: 类型 在命名空间中找不到名称“SqlConnectionStringBuilder” 'System.Data.SqlClient'。此类型已转发给装配体 'System.Data.SqlClient,版本=4.2.0.2,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 考虑添加对它的引用 组装。

2018-04-09T13:48:58.387 [错误] run.csx(71,28): 错误 CS0246: 类型 或找不到命名空间名称“AzureServiceTokenProvider”(是 您缺少 using 指令或程序集引用?)

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】:

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

但是,我注意到当运行时是“beta”时,它会加载using Microsoft.AspNetCore.Mvc;package。

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

所以,我建议你可以尝试使用 azure 函数的 runtime 1 来实现你想要的。

Azure Functions 运行时 2.0 处于预览阶段,目前并非支持 Azure Functions 的所有功能。

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

要使用集成身份验证和 Azure AD 身份连接到数据库,必须将数据库连接字符串中的身份验证关键字设置为 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();

【讨论】:

请澄清您是否让 SQL 连接位与 runtime2 一起使用? 是的,当我在 httptrigger 中使用 runtime2 测试您的代码时,您会遇到同样的错误。但我发现当我在 blobtrigger 中测试时,它运行良好。 谢谢。降级到 .net461 并从 Visual Studio 发布,现在可以正常工作了。

以上是关于Azure Functions 运行时 2 - 使用 SqlClient 的 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”

Azure Functions - 限制并行执行

如何使用 Python Azure Functions QueueTrigger 手动使消息出队?

在本地按需运行 Azure Functions

在Azure Functions中加载第三方DLL

在 Azure Functions 上使用 AdWords API