.net “System.Data.SqlClient.TdsParser”的类型初始值设定项在从Azure函数调用存储过程时引发异常错误

mzaanser  于 2023-01-18  发布在  .NET
关注(0)|答案(7)|浏览(452)

我有一个包含智能电表读数的Azure Event hub。我正在尝试使用Azure Function将电表读数写入Azure SQL DB。我已经在Azure SQL DB中创建了一个目标表和一个存储过程,以解析JSON并将内容存储在表中。我已经成功测试了存储过程。
但是,当我从Azure函数调用它时,我收到一个错误:“System.Data.SqlClient.TdsParser”的类型初始值设定项引发了异常。出于测试目的,我尝试从我的Azure函数执行简单的SQL选择语句,但却出现了相同的错误。我现在很困惑,因为我尝试了许多选项,但都没有任何运气。以下是Azure函数代码:

#r "Microsoft.Azure.EventHubs"

using System;
using System.Text;
using System.Data;
using Microsoft.Azure.EventHubs;
using System.Data.SqlClient;
using System.Configuration;
using Dapper;

public static async Task Run(string events, ILogger log)
{
    var exceptions = new List<Exception>();

    try
      {
            if(String.IsNullOrWhiteSpace(events))
                return;
            try{
                string ConnString = Environment.GetEnvironmentVariable("SQLAZURECONNSTR_azure-db-connection-meterreadevents", EnvironmentVariableTarget.Process);

                using(SqlConnection conn = new SqlConnection(ConnString))
                {
                    conn.Execute("dbo.ImportEvents", new { Events = events }, commandType: CommandType.StoredProcedure);
                }

            } catch (Exception ex) {
                log.LogInformation($"C# Event Hub trigger function exception: {ex.Message}");
            }
        }
        catch (Exception e)
        {
            // We need to keep processing the rest of the batch - capture this exception and continue.
            // Also, consider capturing details of the message that failed to process so it can be processed again later.
            exceptions.Add(e);
        }

    // Once processing of the batch is complete if any messages in the batch failed process throw an exception so that there is a record of the failure.

    if (exceptions.Count > 1)
        throw new AggregateException(exceptions);

    if (exceptions.Count == 1)
        throw exceptions.Single();
}

传入的事件采用JSON格式,如下所示

{ 
   "current_consumption":450,
   "back_low":0.004,
   "current_back":0,
   "total_high":13466.338,
   "gas":8063.749,
   "current_rate":"001",
   "total_low":12074.859,
   "back_high":0.011,
   "timestamp":"2020-02-29 22:21:14.087210"
}

存储过程如下所示:

CREATE PROCEDURE [dbo].[ImportEvents]
@Events NVARCHAR(MAX)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON

    -- Insert statements for procedure here
    INSERT INTO dbo.MeterReadEvents

    SELECT * FROM OPENJSON(@Events) WITH (timestamp datetime2, current_consumption int, current_rate nchar(3), current_back int, total_low numeric(8, 3), back_high numeric(8, 3), total_high numeric(8, 3), gas numeric(7, 3), back_low numeric(8, 3))
END

我已经添加了一个SQL AZURE类型的连接字符串,并通过字符串中的实际密码更改了{your password}。对于如何解决这个问题,或者如何获得更多的日志记录,因为错误非常普遍?

bkkx9g8r

bkkx9g8r1#

我通过重新安装Microsoft.Data.SqlClient.SNI修复了这个异常,然后安装了cleanrebuild

xuo3flqw

xuo3flqw2#

我设法通过在函数应用程序设置中将运行时版本更改为~2来修复这个问题。
这是否意味着这是运行时版本~3中的一些bug或者应该有另一种方法在运行时版本~3中修复它?

az31mfrm

az31mfrm3#

我可能会迟到,在我的情况下,错误的原因是发布时的“目标运行时”,我在Windows机器上开发,但将文件传输到Linux,解决方案是将目标运行时更改为正确的运行时,最初是win-x64(只是因为我是通过本地部署开始的),请参见下面的屏幕截图

4jb9z9bj

4jb9z9bj4#

尝试连接到本地SQL,使用SQL事件探查器,并检查要发送的内容,以及SQL试图对正在执行的命令执行的具体操作。
很难复制您的代码,因为,我显然没有您的Azure SQL:)所以我建议,尝试执行存储过程中的每一步,作为直接查询。
看看这样做是否有效,然后试着把这些语句 Package 成一个叫做背对背的存储过程,让它工作起来,然后把这些命令组合成一个命令,摆弄它,直到它工作起来;)
获取要对Azure SQL执行的最简单查询,以便确保连接有效。(就像简单选择某个对象)
因为没有更多的信息,很难帮助你。

qnzebej0

qnzebej05#

很傻,但是我在安装了EntityFrameworkCore Nuget包后得到了这个,而不是EntityFrameworkCore.SqlServer Nuget包。我安装了EntityFramework 6的SqlServer版本。

eaf3rand

eaf3rand6#

我在文件资源管理器中双击安装了一个VSTO-application,也遇到了同样的错误。Windows没有将所有文件复制到ProgramData中的某个自动位置,所以应用程序根本不完整!
解决方案是在HKEY_CURRENT_USER中手动注册VSTO-application,并将“Manifest”指向包含所有文件的完整目录。(如Microsoft.Data.SqlClient.dllMicrosoft.Data.SqlClient.SNI.x64.dll等)
那些由Windows自动选择的安装/目录将给予意外行为。:(

rsl1atfo

rsl1atfo7#

一些ws方法运行良好,其他方法会失败,并出现相同的错误。我在浏览器中运行了失败的ws方法,并得到了一个很长的、有用的错误消息。其中一项是InnerException,它说

<ExceptionMessage>Failed to load C:\sites\TXStockChecker.xxxxxx.com\bin\x64\SNI.dll</ExceptionMessage>

我注意到这个文件在我的开发环境中是正确的,所以我将它复制到prod ws上的匹配目录,现在所有方法都按预期运行。

相关问题