固定値とリストを含むjsonをデータベースに直接登録したい。
何言ってんの?って感じですよね、ごめんなさい。
ちょっと日本語で説明すると伝わりづらいですが、要はこんなようなjsonを直接データベースに登録したい。
SKILLTABLE.json
{"NAME":"Akira","SKILL":[{"LANGUAGE":"C++","EX_YEAR":"4"},{"LANGUAGE":"Java","EX_YEAR":"3"},{"LANGUAGE":"C#","EX_YEAR":"2"}]}
登録後のイメージはこんな感じ。
一つの値は固定で、他のリスト部分は順々に登録したい。
NAME | LANGUAGE | EX_YEAR |
---|---|---|
Akira | C++ | 4 |
Akira | Java | 3 |
Akira | C# | 2 |
やってみた
まずはプログラム上でJSONファイルを作成する。
(職場で書いたコードを思い出しながら編集しつつ書いてるので、細かいミスなどあるかもしれませんすいません)
engineer.cs
//クラス定義[JsonObject("skill")]classSkill{[JsonProperty("language")]publicstringlanguage{get;set;}[JsonProperty("ex_year")]publicintexyear{get;set;}publicSkill(stringlang,intyear){this.language=lang;this.exyear=year;}}[JsonObject("engineer")]classEngineer{[JsonProperty("name")]publicstringname{get;set;}[JsonProperty("skilllist")]publicList<Skill>skill{get;set;}publicEngineer(stringName,List<Skill>skilllist){this.name=Name;this.skill=skilllist;}}//JSONファイルを作るList<Skill>skillList=newList<Skill>();Skillcplus=newSkill("C++",4)Skilljava=newSkill("Java",3)Skillcsharp=newSkill("C#",2)skillList.Add(cplus);skillList.Add(java);skillList.Add(csharp);Engineerengineer=newEngineer("Akira",skillList);stringjson=Newtonsoft.Json.JsonConvert.SerializeObject(engineer);
なんで最初から"Name"のメンバ変数加えとかないの?って思われるかもしれないですが
「Skillのリストが引数として与えられて、そこに名前だけ後付したい」
という要求があるものとしてみてください。
jsonをデータベースに登録する
engineer.cs
Stringsql;sql=$"DECLARE @json NVARCHAR(MAX) = '{json}';"+$"DECLARE @name = 'SELECT name FROM OPENJSON(@json)WITH(name varchar(10) '$.name');'"+$"INSERT INTO table SELECT @name, language, ex_year FROM OPENJSON(@json,'$.engineer')"+$"WITH(language varchar(10) '$.language', ex_year varchar(2) '$.ex_year)"
データベースに接続する部分だったり、SQL実行する部分は書いてないですが
それは他の記事やブログにも色々書いてあるので割愛します。
このSQLを叩いてあげれば登録できるはずです。
おわり
SQLど素人だったのでこの方法を見つけるまでに大変時間がかかりました...
同じように困ってる人のヒントになれば幸いです。
冗長な書き方してる可能性があるので、その場合はご指摘お願いします。