Как заставить программу создать базу данных или что-то похожее на файл сохранения в c# - PullRequest
1 голос
/ 12 марта 2020

Хорошо, я пытаюсь создать программу, которая позволит мне создавать базу данных рецептов. Данные, которые я пытаюсь сохранить, имеют вид:

class RecipeDataBase
   {
      int RecipeID;
      string RecipeNames;
      string[,] Ingredients = new string[30, 30];
      string[] Steps = new string[30];
    }

Сначала я пытаюсь заставить программу сделать это, у нее есть опция создания новой базы данных, это создаст пустой файл сохранения с имя базы данных рецептов (например, DinnerRecipes.rdb). Затем у меня есть другая форма, которая предназначена для того, чтобы позволить пользователю добавлять рецепты в любую базу данных, которую они выбирают, и, наконец, у меня есть другая форма, которая позволяет пользователю редактировать рецепты внутри базы данных, а также перечисляет все текущие имена рецептов в пределах той базы данных, которую они выбрал.

Идея в том, что у меня есть программа, с которой я могу создавать почти цифровые кулинарные книги для другой программы, над которой я работаю. в то время как почти 85% кода, который я знаю, а остальное я получаю, это часть файла сохранения, которую я получаю.

В настоящее время у меня есть только;

//Setting up and restricting the save system
        SaveFileDialog CRDB = new SaveFileDialog();
        CRDB.InitialDirectory = @"./";
        CRDB.RestoreDirectory = true;
        CRDB.FileName = "*.rdb";    
        CRDB.Filter = "Recipe Database |*.rdb";

        //running the save display and if they click ok creating a blank datebase.
        if (CRDB.ShowDialog() == DialogResult.OK)
        {
            //This is to prep the database template for saving and creating the database file.
            RecipeDataBase recipes = new RecipeDataBase();

            Stream fileStream = CRDB.OpenFile();
            StreamWriter sw = new StreamWriter(fileStream);

            sw.Write(recipes);
            sw.Close();
            fileStream.Close();
        }

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

RecipeID = 1;
RecipeNames = "Homemade Pasta Sauce";
Ingredients = ["Tomato", "Basil", "Onions", "Garlic", ect...]["4", "6 leaves or a tablespoon of ground", "3 Medium Sized", "8 clove(minced)", ect..];    
Steps = ["Peel and seed the tomatoes and set aside.", "Chop the onion, mince the garlic, and grate half of the carrot.", "Pour the olive oil into a large stockpot over medium heat.", ect];

Что меня беспокоит при сохранении данных прямо в текстовый файл, так как не каждый рецепт содержит одинаковое количество ингредиентов или этапов. Я хочу убедиться, что при загрузке информации, которая не приводит к извлечению неверных данных, я также хочу, чтобы RecipeID идентифицировался легко.

Последние три дня я потратил на поиск ответ, который я ищу, и я не знаю, неправильно ли я спрашиваю или просто не связываю ответы, которые я нахожу с моим проектом. Пожалуйста, помогите мне Stackoverflow Кеноби Ваша единственная надежда.

1 Ответ

1 голос
/ 12 марта 2020

Вам следует сериализовать ваши данные в формате, который вы можете сохранить, обычно это либо строка JSON или XML, либо двоичный формат, такой как protobuff или MessagePack. Более подробную информацию о сериализации можно найти здесь:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/

и

https://docs.microsoft.com/en-us/dotnet/standard/serialization/basic-serialization

Возможно, вам придется изменить ваши классы - например, добавив конструкторы по умолчанию или атрибут [Serializable].

Некоторые примеры сериализации (по ссылкам):

Binary:

MyObject obj = new MyObject();  
obj.n1 = 1;  
obj.n2 = 24;  
obj.str = "Some String";  
IFormatter formatter = new BinaryFormatter();  
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);  
formatter.Serialize(stream, obj);  
stream.Close();  

JSON:

string jsonString = JsonSerializer.Serialize(weatherForecast);
File.WriteAllText(fileName, jsonString);
...