using System;
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//string directory = Path.Combine(
// Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ProgramName");
string directory = Path.Combine("D:\\", "ProgramName");
string file = Path.Combine(directory, "data.xml");
Data data = new Data
{
Amount = 150m
};
Display(data, "Исходный вариант");
try
{
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
Serializer.SaveToXml(file, data);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
// Как будто читаем где-то в другом месте программы и не сразу же после записи
// -----------------------------
try
{
Data fromFile = null;
if (File.Exists(file))
{
fromFile = Serializer.LoadXml<Data>(file);
}
else
{
fromFile = new Data();
}
Display(fromFile, "Прочитанный из файла");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
private static void Display(Data data, string message)
{
Console.WriteLine(message + ". Amount: {0}", data.Amount);
}
}
public class Data
{
public decimal Amount { get; set; }
}
public static class Serializer
{
public static void SaveToXml<T>(String fileName, T serializableObject)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextWriter textWriter = new StreamWriter(fileName))
{
serializer.Serialize(textWriter, serializableObject);
}
}
public static T LoadXml<T>(String fileName)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader textReader = new StreamReader(fileName))
{
return (T)serializer.Deserialize(textReader);
}
}
}
}
class BudgetUnit
{
// Для работы с БД имя одного из полей должно заканчиваться на "id"
public int Id { get; set; }
public int changeInAmount { get; set; }
public DateTime dt { get; set; }
public string description { get; set; }
// Также необходимо наличие пустого конструктора
public BudgetUnit()
{ }
// Конструктор опционально
public BudgetUnit(int changeInAmount, string description)
{
this.changeInAmount = changeInAmount;
this.description = description;
dt = DateTime.Now;
}
}
using System.Data.Entity;
namespace Budget
{
class BudgetUnitContext : DbContext
{
// Пустой конструктор. "DbConnection" - имя соединения настроим чуть
// ниже.
public BudgetUnitContext()
: base("DbConnection")
{ }
public DbSet<BudgetUnit> Units { get; set; }
}
}
static void Main(string[] args)
{
// Внесение данных
using (BudgetUnitContext db = new BudgetUnitContext())
{
BudgetUnit bu1 = new BudgetUnit(35000, "Аванс");
BudgetUnit bu2 = new BudgetUnit(15000, "Сосед вернул долг");
BudgetUnit bu3 = new BudgetUnit(-12000, "Покупка пароварки");
db.Units.Add(bu1);
db.Units.Add(bu2);
db.Units.Add(bu3);
db.SaveChanges();
Console.WriteLine("Объекты добавлены");
// Можно получать данные в этом же блоке, но для наглядности вынесу в отдельный
}
// Получение данных
using (BudgetUnitContext db = new BudgetUnitContext())
{
var units = db.Units;
Console.WriteLine("Список объектов");
int money = 0;
foreach (BudgetUnit u in units)
{
money += u.changeInAmount;
Console.WriteLine("{0}: {1}, {2} - {3}, остаток средств {4}", u.Id,
u.dt, u.changeInAmount, u.description, money);
}
}
}
首先,可以尝试在 XML 中进行序列化。提供了完整的代码示例。
有很多方法,但我认为最简单的方法是使用 EntityFramework 和 Code First 方法。
CodeFirst 很方便,因为您不需要自己创建数据库,它会在您第一次进入程序时自动创建,然后您将使用它。
创建一个类来处理预算。所有方法和必填字段(资金数量、资金操作、操作日期、描述)
创建一个项目,通过nuget包连接EF。
接下来,我们创建一个用于处理预算的类。在我的例子中,像这样
接下来,要使用数据库,您需要创建一个上下文类,您可以阅读它,例如,这里:https ://msdn.microsoft.com/ru-ru/library/system.data.entity.dbcontext (v=vs.113).aspx
我得到了这样的东西:
接下来,你需要去 App.config 那里找到结束标签
并在其后添加一个名为“DbConnection”的连接字符串:
实际上,这就是将数据保存到数据库所需的全部内容。它仍然在程序中使用生成的机制: