0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C#で固定値とリストを含むjsonをデータベースに登録する

Last updated at Posted at 2019-11-29

固定値とリストを含む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ど素人だったのでこの方法を見つけるまでに大変時間がかかりました...
同じように困ってる人のヒントになれば幸いです。
冗長な書き方してる可能性があるので、その場合はご指摘お願いします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?