固定値とリストを含む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")]
class Skill{
[JsonProperty("language")]
public string language {get; set;}
[JsonProperty("ex_year")]
public int exyear {get; set;}
public Skill(string lang,int year){
this.language = lang;
this.exyear = year;
}
}
[JsonObject("engineer")]
class Engineer{
[JsonProperty("name")]
public string name {get; set;}
[JsonProperty("skilllist")]
public List<Skill> skill {get; set;}
public Engineer(string Name,List<Skill> skilllist){
this.name = Name;
this.skill = skilllist;
}
}
//JSONファイルを作る
List<Skill> skillList= new List<Skill>();
Skill cplus = new Skill("C++",4)
Skill java = new Skill("Java",3)
Skill csharp = new Skill("C#",2)
skillList.Add(cplus);
skillList.Add(java);
skillList.Add(csharp);
Engineer engineer = new Engineer("Akira",skillList);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(engineer);
なんで最初から"Name"のメンバ変数加えとかないの?って思われるかもしれないですが
「Skillのリストが引数として与えられて、そこに名前だけ後付したい」
という要求があるものとしてみてください。
jsonをデータベースに登録する
engineer.cs
String sql;
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ど素人だったのでこの方法を見つけるまでに大変時間がかかりました...
同じように困ってる人のヒントになれば幸いです。
冗長な書き方してる可能性があるので、その場合はご指摘お願いします。