Azure Functions + Azure SQL:会话提供程序错误 19 - 物理连接不可用

Azure functions + Azure SQL : session provider error 19 - physical connection is not usable

提问人:Marco Jr 提问时间:10/12/2022 更新时间:10/14/2022 访问量:130

问:

这从今天开始占据...... 我一直在寻找解决方案,但我只能在不同的场景中找到它,例如在 Azure Functions 之外或使用不同的客户端库。无论如何。。。

这是我的客户:

using System;
using endpoints3t.Models;
using System.Data.SqlClient;

namespace endpoints3t.DataAccess
{
    internal class MssqlClient
    {
        public MsSqlServer Client;
        private string thisEnv = Environment.GetEnvironmentVariable("ThisEnvironment");
        public MssqlClient()
        {
            var str = Environment.GetEnvironmentVariable($"MsSql_{thisEnv}_ConnectionString");
            SqlConnection c = new SqlConnection(str);
            Client = new MsSqlServer()
            {
                Client = c
            };
        }
    }
}

这是一个简单调用的示例:

public async Task<List<Something>> GetSomeData()
        {
            if (msSQL.Client.Client.State == System.Data.ConnectionState.Closed)
            {
                msSQL.Client.Client.Open();
            }
            using (SqlCommand cmd = new SqlCommand("ExecMyStoredProcedure", msSQL.Client.Client))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                var reader = await cmd.ExecuteReaderAsync();
                while (reader.Read())
                {
                    var item = new Something()
                    {
                        Id = Guid.Parse(reader["Id"].ToString())
                    };
                    result.Add(item);
                }
            }
            return result;
        }

根据文档,System.Data.SqlClient 控制连接的打开/关闭,也许由于这个原因,我找不到太多关于如何处理这种情况的文档。有什么帮助吗?

azure-functions azure-sql-server system.data.sqlclient

评论


答:

1赞 Delliganesh Sevanesan 10/14/2022 #1

如果要连接 azure 函数外部的任何服务,则必须注入该函数。

解决方法如下

在这里,我创建了 azure 函数并创建了连接类来打开连接并插入到 SQL 数据库。

注意:尝试连接 Azure SQL Server 时,有权进行连接。确保您的 IP 已添加到防火墙中。

enter image description here

触发功能

public class Function1
    {
        private readonly connectdb getconnection;
        public Function1(connectdb getconnection)
        {
            this.getconnection = getconnection ?? throw new ArgumentNullException(nameof(getconnection));
        }
        [FunctionName("Function1")]
        public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            // Get the connection string from app settings and use it to create a connection.
            var str = Environment.GetEnvironmentVariable("sqldb_connection");
            var resconn = await getconnection.Getconn(str);
            log.LogInformation("$\"{resconn} rows were updated\"" + resconn);
        }
    }

连接 .cs

public async Task<int> Getconn(string myconn)
        {
            using (SqlConnection conn = new SqlConnection(myconn))
            {
                conn.Open();
                var text = " Insert into <table name>(col2,col2,col3) Values('AAA','BBB','CCC')";

                using (SqlCommand cmd = new SqlCommand(text, conn))
                {
                    // Execute the command and log the # rows affected.
                    var rows = await cmd.ExecuteNonQueryAsync();
                    return rows;
                }
            }
        }

结果

enter image description here

示例结果的 GIF 版本

enter image description here