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を知らないので、合っているのだったらごめんなさい。
変えました、ありがとうございます!