Функции Azure - извлечение базы данных SQL в выходной BLOB-объект - PullRequest
0 голосов
/ 27 августа 2018

Я ссылаюсь на приведенное ниже решение, которое я нашел в стеке. Это довольно близко к тому, что я пытаюсь сделать, но после недели пробовать различные варианты я не ближе.

Я пытаюсь написать функцию Azure, которая будет извлекать все данные из базы данных Azure и выводить результаты в хранилище BLOB-объектов.

Ниже моя попытка. После исчерпания всех остальных, по общему признанию, я не очень хорош в C #, так что, вероятно, это мой недостаток. Любая помощь будет принята с благодарностью.

Вот функция Azure:

#r "System.Configuration"
#r "System.Data"

using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Text;
using System.IO;

public static void Run(
    [TimerTrigger("0 */30 * * * *")] TimerInfo myTimer, 
    [Blob("mycontainer/myblob.txt", FileAccess.Write)] out string OutputBlob, 
    TraceWriter log)
{

   SqlDataReader rdr = null;

   var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;

   using (var conn = new SqlConnection(str))
   {
        conn.Open();

        // Query Text
        var text = "SELECT FirstName, LastName FROM Kpi";

        using (var cmd = new SqlCommand(text, conn))
        {
            // Execute the command 
            rdr = cmd.ExecuteReader();

            var csv = new StringBuilder();

            while (rdr.Read())
            {
                // get the results of each column
                string FirstName = (string)rdr["FirstName"];
                string LastName = (string)rdr["LastName"];

                // create a string
                var newLine = string.Format("{0},{1}", FirstName, LastName);
                csv.AppendLine(newLine);
            }

            // How do I get the results to the outputBlob ??
            File.WriteAllText(outputBlob, csv.ToString());
        }
    }
}

Вот ошибка:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: исключение при выполнении функции: Functions.TimerTriggerCSharp1 ---> Microsoft.CodeAnalysis.Scripting.CompilationErrorException: сценарий Компиляция не удалась. в асинхронном режиме Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker.CreateFunctionTarget (CancellationToken CancellationToken) в C: \ projects \ azure-webjobs-sdk-script \ src \ WebJobs.Script \ Description \ DotNet \ DotNetFunctionInvoker.cs: 340 в асинхронном режиме

Скриншот сообщения об ошибке

Решение найдено при переполнении стека

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вы используете атрибуты привязки в скрипте C #, что неверно ... В указанном решении используется предварительно скомпилированный проект .NET, а не скрипт.

При использовании скрипта убедитесь, что ваш function.json файл выглядит следующим образом:

{
  "bindings": [
    {
      "schedule": "0 */30 * * * *",
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in"
    },
    {
      "name": "OutputBlob",
      "type": "blob",
      "path": "mycontainer/myblob.txt",
      "direction": "out"
    }
  ],
  "disabled": false
}

затем удалите атрибуты из определения функции:

public static void Run(
    TimerInfo myTimer, 
    out string OutputBlob, 
    TraceWriter log)

и, наконец, назначить содержимое BLOB-объекта непосредственно в конце вызова

// ... 
            OutputBlob = csv.ToString();
        }
    }
}

В целом, я советую перейти к предварительно скомпилированному проекту C # (как тот, который вы указали в вопросе). Это требует некоторой настройки (в Visual Studio или VS Code), но это поможет вам избежать проблем и найти ошибки быстрее и точнее.

0 голосов
/ 28 августа 2018

Я думаю, вы можете просто назначить это. Выходной BLOB-объект представляет собой строку:

           OutputBlob= csv.ToString();
...