【AzureでRDBとfunctionsを繋ぎたい】(3)functionsからSQLの操作


★当記事は連続記事となります。
前項の設定を使用している箇所もあるので最初からお読み頂くことをお勧めします。

+ [AzureでRDBとfunctionsを繋ぎたい（タイトル）](https://qiita.com/yotsuno/private/5897c2a33984ecb99a54) 
+ 　　[(1)SqlDataBaseを作るまで](https://qiita.com/yotsuno/private/b008853cf8a9a433a83f) 
+ 　　[(2)functionsの作成](https://qiita.com/yotsuno/private/28fa6f5468ac3c3bb3b7)
+ 　　(3)functionsからSQLの操作(当記事)

　
上記で作成したSQLDataBaseとfunctionsを繋ぎます。
タイトルでも記載しましたがここで様々なトラブルが出ました。気を付けるポイントとして

+ Nugetパッケージのバージョンを確認する
+ AzureWebJobsStorageの情報を確認する
+ SQLの接続文字列の入力

あたりとなります。　

#NuGetパッケージを追加（バージョン超注意）
AzureFunctionsにAzureのSQLを操作をさせるには、まずnugetパッケージを追加する必要があります。

ソリューションエクスプローラーから右クリックで「nugetパッケージの追加」
![001・nugetその1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/7ece4bcc-f37a-7a98-7de5-2058c9409791.png)
　
　
「参照」タブを選び、検索窓に「System.Data.SqlClient」を入力すると出てくるので選択。
![002・nugetその2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/59a7f7e3-7669-e86a-c605-81bdb6d8daac.png)
　
　
<font color="Red">僕は4.7を入れたのでハマりました。入れるのは4.5.1です。</font>
![003・nugetバージョンはこれ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/5f6c27ba-60cf-c1d5-6ee8-28b7c7366db3.png)
　に
　
#AzureWebJobsStorageの情報をVisualStudioに設定されているか確認
続いて、functionsで使用しているストレージの情報をVisual Studioにちゃんと入れます。（入っている場合もあるみたいだが、自分はここが外れていてハマりました）。
ポータルから作成した関数アプリを選択し、「関数アプリの設定」を選択。
![004・ストレージのアドレス接続情報確認1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/87c55058-9803-93a7-f853-88279eed8a3f.png)
　
　
「アプリケーション設定の管理」を選択
![005・ストレージのアドレス接続情報確認2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/5dddc257-4817-9674-168c-9b48bb1918a5.png)
　
　
そこにある「AzureWebJobsStorage」の値をコピーします。上の方に「値を表示する」があるのここを押す。
![006・ストレージのアドレス接続情報確認3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/430edf6f-4d39-8169-1dd3-2a23d49d0421.png)
　
　
かなり長い文字列なので。この鉛筆マークを押すと別ウィンドウで値が表示されます。
![007・長いので編集ボタンで別ウィンドウで値を表示する事が出来る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/f424be5d-b189-0cc8-732c-49f24ab12530.png)
　
　
VisualStudioに戻ります。発行（デプロイ）メニューの中に「Azure App Servisの設定を編集する」があるのでこれを選択
![008・ストレージとの接続１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/4416ee8e-9507-2e27-f194-da2e02e63c92.png)
　
　
ここに「AzureWebJobsStorage」があるのでそこにポータルでコピーした「AzureWebJobsStorage」をペースト
![009・ストレージとの接続2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/3d16b3d1-74c7-ca76-3cbd-46820ebddaa4.png)
　
　
#SQLの接続文字列を投入
ポータルから先に作ったSQLを選択し「接続文字列」を選び、「ADO.NET」を選びます。その中のテキストボックスに入っている文字列をコピーします。
<font color="Red">コピーする際に、パスワードの部分が{your_password}になっているので先に設定したSQLのパスワードに書き換えます。書き換える時に{}は取ります。</font>
![010・sqlから接続文字列を持ってくる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/6ad8e8db-0ae9-e564-cfdf-45c1944cb493.png)
　
　
ついさっき、AzureWebJobsStorageを設定した「アプリケーション設定の管理」で今度は値を追加します。設定の追加という項目があるのでこれを選択。
![011・設定の追加ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/e6a952d0-1289-6255-635c-35fcac3a0e23.png)
　
　
設定の追加。sqldb_connectionと名前を付けてみます。この名前はfunctions内のコードで使えます。
![012・設定の追加1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/7a123cbc-dd20-c286-a88a-18b12575a0c0.png)
　
　
そうすると、sqldb_connectionの設定が出来るようになるので、ローカル、リモート共に、先ほどコピーとパスワードの部分を正規のものに変更した接続文字列を貼り付けます。
![012・設定の追加2・欄が出来るので入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/312857dc-a068-b95b-0ef0-72fb3825f1a4.png)
　
　
#新しい関数追加
せっかくなので、新しい関数を追加してみます。
ソリューションエクスプローラーから「追加」→「新しいAzure関数」を選択
![013・新しい関数追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/2366da81-b741-57a3-88d4-6467c0d46ce0.png)
　
　
Azure関数を選択
![014・azure関数を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/65035f31-970d-2941-71e0-827c8437fc18.png)
　
　
また、今回はhttpトリガーの関数を選択。特に意味はありませんが今回はAuthorizationlevelはfunctionにしてみます。
![015・またもhttp。今度はfunction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/9b3b97ee-106e-1879-9674-23db440407b8.png)
　
　
コードを記載します。


```C#
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Data.SqlClient;

namespace sql_and_function
{
    public static class Function2
    {
        [FunctionName("Function2")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {

            // Get the connection string from app settings and use it to create a connection.
            var str = Environment.GetEnvironmentVariable("sqldb_connection");
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                var text = "INSERT INTO Hajimetenodb VALUES ('SABURO',50);";

                using (SqlCommand cmd = new SqlCommand(text, conn))
                {
                    // Execute the command and log the # rows affected.
                    var rows = await cmd.ExecuteNonQueryAsync();
                    log.LogInformation($"{rows} rows were updated");
                }
            }

            return (ActionResult)new OkObjectResult($"SQL UPDATE");
        }
    }
}
```

ポイントとしては、

+ using System.Data.SqlClient;　の追加
+ var str = Environment.GetEnvironmentVariable("sqldb_connection");　で先ほど入れた接続文字列の取得。これを基にSQLアクセスへ繋げている。
+ 今回は　"INSERT INTO Hajimetenodb VALUES ('SABURO',50);　というクエリを発行しています。
+ 最後に「SQL UPDATE」というメッセージを出しています。
　
　
こちらも発行を行い、実行してみます。
![019・サクセスメッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/220b8274-3d43-3acc-1080-f6f0ba15bd1b.png)
　
　
早速ssmsで確認。追加されていました。
![020・追加された.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/6662973b-bbcc-03e3-66ad-1b03ec944ebe.png)