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;"
}
}
で、このままだと色々しにました。わたしの場合、以下の処理をしました:
Encrypt=True;をEncrypt=False;にした。(なんかEncryptに対応してないってエラーが出たから取り敢えず無効化してみた)TrustServerCertificate=False;を消した。(なんかTrustServerCertificateに対応してないってエラーが出たから取り敢えず消してみたら動いた)- 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;
}
スクショ




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