Azure Functions v2 Connectionstring来自应用程序设置

Azure Functions v2 Connectionstring来自应用程序设置,function,azure,connection-string,Function,Azure,Connection String,我制作了一个简单的Azure Functions v2 Web服务,它连接到Azure SQL数据库,运行一个包含3个参数的存储过程,并将结果作为JSON输出返回。它的工作方式与现在一样(使用run.csx文件中的connectionstring) 但是如何从应用程序设置获取connectionstring呢 我在这里和其他地方都试过各种各样的指南。但我能找到的只是一长串的参考文献和一大堆需要添加的代码。我严格按照指南操作(也在应用程序设置中设置了值),但它就是不起作用。我对C#比较陌生,所以可

我制作了一个简单的Azure Functions v2 Web服务,它连接到Azure SQL数据库,运行一个包含3个参数的存储过程,并将结果作为JSON输出返回。它的工作方式与现在一样(使用run.csx文件中的connectionstring)

但是如何从应用程序设置获取connectionstring呢

我在这里和其他地方都试过各种各样的指南。但我能找到的只是一长串的参考文献和一大堆需要添加的代码。我严格按照指南操作(也在应用程序设置中设置了值),但它就是不起作用。我对C#比较陌生,所以可能是我不明白我该做什么

无论如何,这是我的代码和建议的修复,据我所知:

#r "Newtonsoft.Json"
#r "System.Data"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data;
using System.Data.SqlClient;

public static async Task<ActionResult> Run(HttpRequest req, ILogger log)
{
   log.LogInformation("C# HTTP trigger function processed a request.");

   string login = req.Query["login"];
   string pwd = req.Query["password"];
   string TransID = req.Query["TransID"];

   string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
   dynamic data = JsonConvert.DeserializeObject(requestBody);
   login = login ?? data?.login;
   pwd = pwd ?? data?.password;
   TransID = TransID ?? data?.TransID;

   var cnnString = "Server=MyServer;Database=WebServices;User Id=MyUser;Password=MyPassword;Encrypt=True;";

        try
        {
            DataTable table = new DataTable();
            SqlConnection connection = new SqlConnection(cnnString);
            SqlCommand cmd = new SqlCommand("sp_GetRegRW", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Login", login));
            cmd.Parameters.Add(new SqlParameter("@Password", pwd));
            cmd.Parameters.Add(new SqlParameter("@TransID", TransID));
            await connection.OpenAsync();
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(table);
            }

            return (ActionResult)new OkObjectResult(JsonConvert.SerializeObject(table));
        }
        catch (SqlException sqlex)
        {
            return (ActionResult)new OkObjectResult($"The following SqlException happened: {sqlex.Message}");
        }
        catch (Exception ex)
        {
            return (ActionResult)new OkObjectResult($"The following Exception happened: {ex.Message}");
        }

}
#r“Newtonsoft.Json”
#r“系统数据”
Net系统;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Primitives;
使用Newtonsoft.Json;
使用系统数据;
使用System.Data.SqlClient;
公共静态异步任务运行(HttpRequest请求,ILogger日志)
{
LogInformation(“C#HTTP触发器函数处理了一个请求。”);
字符串login=req.Query[“login”];
字符串pwd=req.Query[“password”];
字符串TransID=req.Query[“TransID”];
string requestBody=等待新的StreamReader(req.Body).ReadToEndAsync();
动态数据=JsonConvert.DeserializeObject(requestBody);
登录=登录??数据?登录;
pwd=pwd??数据?密码;
TransID=TransID??数据?TransID;
var cnnString=“Server=MyServer;Database=WebServices;User Id=MyUser;Password=MyPassword;Encrypt=True;”;
尝试
{
DataTable=新的DataTable();
SqlConnection=newsqlconnection(cnnString);
SqlCommand cmd=新的SqlCommand(“sp_GetRegRW”,连接);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@Login”,Login));
cmd.Parameters.Add(新的SqlParameter(“@Password”,pwd));
cmd.Parameters.Add(新的SqlParameter(“@TransID”,TransID));
等待连接。OpenAsync();
使用(SqlDataAdapter=newsqldataadapter(cmd))
{
适配器。填充(表格);
}
返回(ActionResult)新的OkObjectResult(JsonConvert.SerializeObject(table));
}
捕获(SqlException sqlex)
{
返回(ActionResult)新的OkObjectResult($“发生了以下SqlException:{sqlex.Message}”);
}
捕获(例外情况除外)
{
返回(ActionResult)新的OkObjectResult($“发生以下异常:{ex.Message}”);
}
}
建议的解决办法:

#r "Newtonsoft.Json"
#r "System.Data"
#r "Microsoft.Extensions.Configuration"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;

public static async Task<ActionResult> Run(HttpRequest req, ILogger log, ExecutionContext context)
{
   var config = new ConfigurationBuilder()
    .SetBasePath(context.FunctionAppDirectory)
    .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables()
    .Build();

   var cnnString =config.GetConnectionString("connWS");
   var setting1 = config["Setting1"];

   log.LogInformation(cnnString);
   log.LogInformation(setting1);
   log.LogInformation("C# HTTP trigger function processed a request.");

   string login = req.Query["login"];
   string pwd = req.Query["password"];
   string TransID = req.Query["TransID"];

   string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
   dynamic data = JsonConvert.DeserializeObject(requestBody);
   login = login ?? data?.login;
   pwd = pwd ?? data?.password;
   TransID = TransID ?? data?.TransID;

        try
        {
            DataTable table = new DataTable();
            SqlConnection connection = new SqlConnection(cnnString);
            SqlCommand cmd = new SqlCommand("sp_GetRegRW", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Login", login));
            cmd.Parameters.Add(new SqlParameter("@Password", pwd));
            cmd.Parameters.Add(new SqlParameter("@TransID", TransID));
            await connection.OpenAsync();
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(table);
            }

            return (ActionResult)new OkObjectResult(JsonConvert.SerializeObject(table));
        }
        catch (SqlException sqlex)
        {
            return (ActionResult)new OkObjectResult($"The following SqlException happened: {sqlex.Message}");
        }
        catch (Exception ex)
        {
            return (ActionResult)new OkObjectResult($"The following Exception happened: {ex.Message}");
        }

}
#r“Newtonsoft.Json”
#r“系统数据”
#r“Microsoft.Extensions.Configuration”
Net系统;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Primitives;
使用Newtonsoft.Json;
使用系统数据;
使用System.Data.SqlClient;
使用Microsoft.Extensions.Configuration;
公共静态异步任务运行(HttpRequest请求、ILogger日志、ExecutionContext)
{
var config=new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile(“local.settings.json”,可选:true,重载更改:true)
.AddenEnvironmentVariables()
.Build();
var cnnString=config.GetConnectionString(“connWS”);
var setting1=config[“setting1”];
日志信息(cnnString);
日志信息(设置1);
LogInformation(“C#HTTP触发器函数处理了一个请求。”);
字符串login=req.Query[“login”];
字符串pwd=req.Query[“password”];
字符串TransID=req.Query[“TransID”];
string requestBody=等待新的StreamReader(req.Body).ReadToEndAsync();
动态数据=JsonConvert.DeserializeObject(requestBody);
登录=登录??数据?登录;
pwd=pwd??数据?密码;
TransID=TransID??数据?TransID;
尝试
{
DataTable=新的DataTable();
SqlConnection=newsqlconnection(cnnString);
SqlCommand cmd=新的SqlCommand(“sp_GetRegRW”,连接);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@Login”,Login));
cmd.Parameters.Add(新的SqlParameter(“@Password”,pwd));
cmd.Parameters.Add(新的SqlParameter(“@TransID”,TransID));
等待连接。OpenAsync();
使用(SqlDataAdapter=newsqldataadapter(cmd))
{
适配器。填充(表格);
}
返回(ActionResult)新的OkObjectResult(JsonConvert.SerializeObject(table));
}
捕获(SqlException sqlex)
{
返回(ActionResult)新的OkObjectResult($“发生了以下SqlException:{sqlex.Message}”);
}
捕获(例外情况除外)
{
返回(ActionResult)新的OkObjectResult($“发生以下异常:{ex.Message}”);
}
}

在函数v2中,您应该使用
Environment.GetEnvironmentVariable(“string_name”,EnvironmentVariableTarget.Process)
从应用程序设置和连接字符串中获取值

注意:使用上述方法时,第一个参数取决于类型。这意味着当连接字符串的类型为
SQLAZURE
时,第一个参数应该是
SQLAZURE+CONNSTR+\u stringName

截图如下:

代码示例:

//for connection string
string connStr = Environment.GetEnvironmentVariable("SQLAZURECONNSTR_sqldb_connection",EnvironmentVariableTarget.Process);
log.LogInformation("the connection string is: " + connStr);
以及结果快照:

我得到以下错误:ConnectionString属性尚未初始化

您可能应该使用连接字符串创建SqlConnection的实例,,并在尝试执行任何命令之前打开此连接

SqlConnection con = new SqlConnection("connStr");
await con.OpenAsync();

你看过这个吗?感谢链接Brad。我没有在VS本地编码并发布它。我只是直接在在线编辑器中键入代码。我已经从添加了ADO.net连接字符串