Задача сохранить данные из базы MS SQL Server в файл в формате Json, а потом, конечно, восстановить обратно, то есть типа Backup – Restore операции.

Структура данных на картинке ниже, как видно, не простая и для восстановления придется учитывать и сохранить все взаимосвязи по внешним ключам. 

Добавим Юзера в качестве корневого элемента объекта бэкапа. Я не совсем понимаю терминологию Newtonsoft, чем отличается и зачем JObject от JToken. Ну пускай будет так: backupJsonObject это объект, а user = backupJsonObject[“User”] и другие как Accounts это токены.

				
					        public static void BackupSaveJson(string filePath)
        {
            JObject backupJsonObject = new JObject();

            //Сохранить пользователя
            DataTable dt = G.db_select($"select * from Users where ID = {U.Cur.ID}");
            string userJsonString = JsonConvert.SerializeObject(dt);
            backupJsonObject.Add("User", JToken.Parse(userJsonString)[0]);
            JToken user = backupJsonObject["User"];

            //Сохранить все мои Счета 
            dt = G.db_select($"select * from Accounts where UserID = {U.Cur.ID}");
            string accountsJsonString = JsonConvert.SerializeObject(dt);
            //Мои счета сохраняю как объект внутри Юзера
            user["Accounts"] = JToken.Parse(accountsJsonString);
            
            //Сохранить все мои Категории
            dt = G.db_select($"select * from Categories where UserID = {U.Cur.ID}");
            string categoriesJsonString = JsonConvert.SerializeObject(dt);
            user["Categories"] = JToken.Parse(categoriesJsonString);

            //Сохранить все операции по всем моим счетам
            dt = G.db_select($"select o.* from Operations o join Accounts a on a.ID in (Debet_ID, Credit_ID) where UserID = {U.Cur.ID}");
            string operationsJsonString = JsonConvert.SerializeObject(dt);
            user["Operations"] = JToken.Parse(operationsJsonString);

            //Сохранить остатки по всем моим счетам, можно даже не делать этого, так как есть операции, но на всякий
            //При восстановлении, можно проверить остатки из операций с остатками в сохраненном бэкапе
            dt = G.db_select($"select r.* from Acc_Rests r join Accounts a on a.ID = r.Account_ID where UserID = {U.Cur.ID}");
            string accRestsJsonString = JsonConvert.SerializeObject(dt);
            user["Acc_Rests"] = JToken.Parse(accRestsJsonString);

            File.WriteAllText(filePath, backupJsonObject.ToString());
        }
				
			

Будьте внимательны, так как есть JObject.Parse(jsonString1), а есть еще JToken.Parse(jsonString2). Так вот некоторые строки парсятся ка объект, а другие как токен, если перепутать, получим ошибку.

Сохранить данные из SQL в JSON
Tagged on:     

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.