[英]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.