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。
如果你的项目平台是.netcore,it 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 运行时”