【问题标题】:Connect time-triggered Azure Function with Database using SQL Client使用 SQL 客户端将时间触发的 Azure 函数与数据库连接
【发布时间】:2021-08-13 12:44:18
【问题描述】:

我正在使用 SQL 客户端将时间触发的 Azure 函数与 SQL Server 连接,但我没有得到任何数据。

这是我的代码:

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "DefaultConnection": "Data Source=; Initial Catalog=;User ID=;Password=;MultipleActiveResultSets=True;Persist Security Info=True;"        
  }
}

Function1.cs:

public class Function1
{
   [FunctionName("Function1")]
   public static async Task Run([TimerTrigger("0 45 14 * * *")]TimerInfo myTimer, ILogger log)
   {
     var sqlConnection = Environment.GetEnvironmentVariable("DefaultConnection");
     using (SqlConnection conn = new SqlConnection(sqlConnection))
     {
      conn.Open();
      var text = "SELECT * from UserMaster where UserId=1234";
      //This query has around 50 data in the database but still getting no data in it.
      
      using (SqlCommand cmd = new SqlCommand(text, conn))
      {
        using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
        {
          while (reader.Read())
          {
             log.LogInformation($"{reader.GetString(0)}{reader.GetString(1)} rows selected");
             Console.WriteLine("{0} {1}", reader.GetString(0), reader.GetString(1));
          }
        }
      }
     conn.Close();
    }
   log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
  }
}

我不明白它有什么问题。请推荐

【问题讨论】:

  • 你有什么异常吗?调试期间会发生什么,尤其是 SqlConnection 和执行 SqlCommand。他们执行正确吗?我假设您在 local.settings.json 中删除了“DataSource”、“UserID”等的值,因为您不想在 stackoverflow 上发布它们,但通常那里有值?
  • 嗨@rekcul,我没有得到任何异常,它只表明该表没有记录。如果我使用ExecuteScalarAsync 而不是ExecuteReaderAsync 它可以完美运行,但问题是我想要所有记录而不是第一行的单列。我还特意在stackoverflow中删除了“DataSource”、“UserID”等的值。
  • 怎么回事?你有休息吗?感谢您提前回复:)

标签: c# .net-core azure-functions sqlclient azure-function-async


【解决方案1】:

我认为您可以改用public override object this[string name] { get; }。这是我的代码,效果很好,你可以和你的比较一下。

 using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Data.SqlClient;
using System.Collections.Generic;

namespace Function0602
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<List<tinyTest>> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            List<tinyTest> list = new List<tinyTest>();
            var str = "connect_string";
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                var text = "select * from tinyTest;";
                using (SqlCommand cmd = new SqlCommand(text, conn))
                {
                    using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
                    {
                        while (reader.Read())
                        {
                            tinyTest res = new tinyTest();
                            //SqlDataReader skd provide the method of reader["column_name"]
                            res.user_id = (string)reader["user_id"];
                            res.user_name = (string)reader["user_name"];
                            res.age = (int)reader["age"];
                            list.Add(res);
                        }
                    }
                }
                conn.Close();
            }
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            return list;
        }
    }

    public class tinyTest {
        public string user_id { get; set; }
        public string user_name { get; set; }
        public int age { get; set; }
    }
}

【讨论】:

  • 所以据我了解,while循环中的步骤没有执行?
  • 我认为您可以检查阅读器是否有行以确保查询得到正确的结果。 i.stack.imgur.com/6hoAe.png 如果为 false,则表示没有行响应。
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2020-10-20
  • 2021-09-21
相关资源
最近更新 更多