我创建了一个 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 block 在该方法完成之前就结束了。
额外说明:using block 确保调用 Dispose()。调用 Dispose() 是一件好事,因为您正在使用与外部资源(sql 服务器)的连接。如果您不调用 Dispose,连接可能会保持事件状态,而您的程序不再需要保留连接。
但是,由于未“等待”对异步方法的调用,因此程序在释放连接之前不会等待 ExecuteNonQueryAsync() 完成(因为它在“后台”运行)。
有时 ExecuteNonQueryAsync() 在调用 Dispose() 之前完成,有时 ExecuteNonQueryAsync() 太慢。 “运气”的问题。这解释了结果的差异。
关于使用 block :MSDN on using
关于 aysnc 方法:MSDN on Async Await
关于c# - Azure 函数有时不会将行插入 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810582/