Azure 函数有时不会将行插入 SQL 服务器

Azure function sometimes does not insert row into SQL Server

我创建了一个 Azure 函数。它工作正常,除了一件事:它并不总是将内容插入 Azure SQL 服务器,尽管内容总是相同的。根据日志,该函数被触发,但没有插入任何行。它似乎是随机发生的。这是代码:

public static void Run(string myIoTHubMessage, TraceWriter log)
{
    log.Info(myIoTHubMessage);
    if (!string.IsNullOrEmpty(myIoTHubMessage))
    {
        try
        {
            var str = ConfigurationManager.ConnectionStrings["db-messaging"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                log.Info("Connection opened");
                var text = $"INSERT INTO [dbo].[MESSAGE] VALUES ('{myIoTHubMessage}')";
                using (SqlCommand cmd = new SqlCommand(text, conn))
                {
                    var rows = cmd.ExecuteNonQueryAsync();                    
                }
            }
            log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
        }
        catch (Exception ex)
        {
            log.Error($"C# Event Hub trigger function exception: {ex.Message}");
        }
    }
}

在这种情况下,您应该在某处等待 ExecuteNonQueryAsync() 方法或不使用 Async 方法。

我认为你的 using 块在方法完成之前就结束了。

额外说明:using 块确保调用 Dispose()。调用 Dispose() 是一件好事,因为您正在使用与外部资源(sql 服务器)的连接。如果您不调用 Dispose 连接可能会保持活动状态,而您的程序不再需要保留连接。

但是,因为对异步方法的调用不是 "awaited",所以程序没有等待 ExecuteNonQueryAsync() 完成(因为它 运行 在 "background" 之前)处理连接。

有时 ExecuteNonQueryAsync() 在调用 Dispose() 之前完成,有时 ExecuteNonQueryAsync() 太慢。 "luck"的事情。这解释了您的结果的差异。

在使用方块时:MSDN on using

关于 aysnc 方法:MSDN on Async Await

函数的新代码如下:

public static async void Run(string myIoTHubMessage, TraceWriter log)
{
    log.Info(myIoTHubMessage);
    if (!string.IsNullOrEmpty(myIoTHubMessage))
    {
        try
        {
            var str = ConfigurationManager.ConnectionStrings["db-messaging"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                log.Info("Connection opened");
                var text = $"INSERT INTO [dbo].[MESSAGE] VALUES ('{myIoTHubMessage}')";
                using (SqlCommand cmd = new SqlCommand(text, conn))
                {
                    var rows = await cmd.ExecuteNonQueryAsync();                    
                    //log.Info($"{rows} rows were updated");
                }
            }
            log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
        }
        catch (Exception ex)
        {
            log.Error($"C# Event Hub trigger function exception: {ex.Message}");
        }
    }
}