繁体   English   中英

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

[英]Azure Functions runtime 2 - SQL Connections using SqlClient

无法在运行时2中使用.Net SqlClient。遇到有关缺少引用的以下错误:

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:在名称空间'System.Data.SqlClient'中找不到类型名称'SqlConnectionStringBuilder'。 此类型已转发给程序集'System.Data.SqlClient,版本= 4.2.0.2,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a'考虑添加对该程序集的引用。

2018-04-09T13:48.58 [错误] 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'(您是否缺少using指令或程序集引用?)

#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;
        }
    }
}

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

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

如果您的项目平台是.netcore则不支持通过AAD身份验证连接到Azure SQL服务器。

因此,我建议您可以尝试使用azure函数的运行时1来实现所需的功能。

Azure Functions运行时2.0处于预览状态,当前不支持Azure Functions的所有功能。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM