Инициализатор типа для «System.Data.SqlClient.TdsParser» выдал ошибку исключения при вызове хранимой процедуры из функции Azure - PullRequest
1 голос
/ 01 марта 2020

У меня есть Azure Event hub с показаниями моего интеллектуального счетчика электроэнергии. Я пытаюсь использовать Azure Function для записи показаний счетчика в Azure SQL БД. Я создал таблицу назначения в БД Azure SQL и хранимую процедуру для анализа JSON и сохранения содержимого в таблице. Я успешно протестировал хранимую процедуру.

Однако, когда я вызываю ее из моей Azure функции, я получаю ошибку: инициализатор типа для System.Data.SqlClient.TdsParser выдал исключение. В целях тестирования я попытался выполнить простой оператор SQL select из моей функции Azure, но это выдает ту же ошибку. Я потерян в данный момент, потому что я попробовал много вариантов без какой-либо удачи. Вот код функции 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} фактическим паролем в строке. Любые мысли о том, как исправить эту проблему или, возможно, как получить больше журналов, так как ошибка очень общая?.

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Мне удалось решить проблему, изменив версию среды выполнения на ~ 2 в настройках приложения-функции.

Означает ли это, что это какая-то ошибка в версии времени исполнения ~ 3, или должен быть другой способ ее исправить? во время выполнения ~ 3?

0 голосов
/ 01 марта 2020

Попробуйте подключиться к локальному SQL, использовать SQL profiler и проверить, что вы отправляете, и что именно SQL пытается сделать с выполняемой командой.

Очень сложно скопировать ваш код, потому что у меня, очевидно, нет вашего Azure SQL :) Поэтому я бы посоветовал попытаться выполнить каждый шаг в хранимой процедуре как прямые запросы.

Посмотрите, работает ли это, затем попытайтесь обернуть операторы в хранимые процедуры, называемые back-to-back, и заставить это работать. Затем объедините команды в одну команду и возитесь с ней до тех пор, пока она не заработает;)

Получите самый простой запрос для выполнения к Azure SQL, так что вы уверены, что ваше соединение установлено. действительный. (Как просто выбрать что-то)

Потому что без дополнительной информации вам очень сложно помочь.

...