Chomado's Blog
You Are Reading

Azure Functions から SQL Database に書き込む (ポータル版とVS版)

3
C#

Azure Functions から SQL Database に書き込む (ポータル版とVS版)


Azure Functions から SQL Database に書き込むのを初めてやったので、自分用メモです。

Azure portal の Functions に書いたスクリプト

ポータル(webブラウザ)で書いたやつ

#r "System.Configuration"
#r "System.Data"
using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;

public static async Task Run(TimerInfo myTimer, TraceWriter log)
{
    var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(str))
    {
        conn.Open();

        // sample user properties
        var user = new { FirstName = "Madoka", LastName = "Chiyoda" };
        // 走らせるSQL文
        var text = "INSERT INTO Contact (FIRSTNAME, LASTNAME) " + 
                "VALUES(@FirstName, @LastName)";

        using (SqlCommand cmd = new SqlCommand(text, conn))
        {
            cmd.Parameters.AddWithValue("@LastName", user.LastName);
            cmd.Parameters.AddWithValue("@FirstName", user.FirstName);
            // Execute the command and log the # rows affected.
            var rows = await cmd.ExecuteNonQueryAsync();
            log.Info($"{rows} rows were updated");
        }
    }
}

Azure portal での、Functions に設定した、SQL DB の接続文字列設定のところの画面スクショ


Functions の画面のスクショ

SQL Database のテーブルの中身

上のやつを Visual Studio に移したやつ

そろそろブラウザ上でやるの厳しくなってきたので Visual Studio (for Mac でも for Windows でも) でやりたくなってきますよね。

VS上でやる時は、SQLデータベースに接続する時の接続文字列の扱いに注意です。ブラウザ上でやったときと同じようにやるとエラーになります。

接続文字列

最初はこうなってたはず

Server=tcp:functionsqlserver.database.windows.net,1433;Initial Catalog=FunctionSQL;Persist Security Info=False;User ID=ユーザ名;Password=パスワード;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

で、これを local.settings.json に追記します

{
  "ConnectionStrings": {
    "sqldb_connection": "Server=tcp:functionsqlserver.database.windows.net,1433;Initial Catalog=FunctionSQL;Persist Security Info=False;User ID=ユーザ名;Password=パスワード;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  }
}

で、このままだと色々しにました。わたしの場合、以下の処理をしました:

  1. Encrypt=True;Encrypt=False; にした。(なんかEncryptに対応してないってエラーが出たから取り敢えず無効化してみた)
  2. TrustServerCertificate=False; を消した。(なんかTrustServerCertificateに対応してないってエラーが出たから取り敢えず消してみたら動いた)
  3. Azure のポータルに戻り、SQLサーバーのファイアーウォールに穴を開けた(このクライアントのIPアドレスを追加した)

書いたコード

[FunctionName("AddData")]
public static async Task<HttpResponseMessage> AddData(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage req,
    TraceWriter log
)
{
    try
    {
        var str = ConfigurationManager
            .ConnectionStrings["sqldb_connection"]
            .ConnectionString;

        // sample user properties
        var user = new { FirstName = "Madoka", LastName = "Chiyoda" };

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

            var text = "INSERT INTO Contact (FIRSTNAME, LASTNAME) " + 
                       "VALUES(@FirstName, @LastName)";
            using (SqlCommand cmd = new SqlCommand(text, conn))
            {
                cmd.Parameters.AddWithValue("@LastName", user.LastName);
                cmd.Parameters.AddWithValue("@FirstName", user.FirstName);
                // Execute the command and log the # rows affected.
                var rows = await cmd.ExecuteNonQueryAsync();
                log.Info($"{rows} rows were updated");
            }
            return req.CreateResponse(HttpStatusCode.OK, "test", "application/json");
        }
    }
    catch (System.Exception ex)
    {
        log.Info(message: $"しんでしまうとは なさけない! {ex}");
    }
    return null;
}

スクショ

参考(公式ドキュメント)


Madoka Chomado (ちょまど)

千代田まどかです。よく「ちょまど」と呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。

(2) Comments

  1. クローチェ says:

    情報提供ありがとうございます。ところで、LASTNAMEとFIRSTNAMEが逆になっているように見えますが、確認して頂いていいですか? 私はSQLを知らないので、合っているのだったらごめんなさい。

    1. 変えました、ありがとうございます!

ちょまど へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です