.net tag - Almacenar datos de una aplicación C#





propiedad centrar (9)


Una base de datos puede ser excesiva: ¿ha pensado simplemente en guardar los puntajes en un archivo?

Si decide ir con una base de datos, puede considerar SQLite , que puede distribuir como un archivo. Hay un proveedor de .NET de fuente abierta: System.Data.SQLite , que incluye todo lo que necesita para comenzar.

Acceder y leer desde una base de datos en .NET es bastante fácil: eche un vistazo a esta pregunta para obtener un código de muestra.

Recientemente comencé a aprender algo de C # y escribí un clon de Yahtzee. El siguiente paso (ahora que la lógica del juego está en su lugar y funciona correctamente) es integrar algún método para mantener estadísticas en todos los juegos jugados.

Mi pregunta es: ¿cómo debo almacenar esta información? Lo primero que pensé fue usar una base de datos y tengo la sensación de que esa es la respuesta que obtendré ... si ese es el caso, ¿podría indicarme un buen recurso para crear y acceder a una base de datos desde una aplicación C #?

Almacenar en un archivo XML en realidad tiene más sentido para mí, pero pensé que si sugería que sería destrozado;). Estoy acostumbrado a crear aplicaciones web y, para aquellos, los archivos de texto generalmente son mal vistos.

Entonces, yendo con un archivo XML, ¿qué clases debería estar mirando que permitan una fácil manipulación?




Una base de datos probablemente sería excesiva para algo como esto: comience con el almacenamiento de su información en un documento XML (o una serie de documentos XML, si hay una gran cantidad de datos). Obtienes todo el ingenioso material de implementación de XCopy, aún puedes usar LINQ, y sería una transición suave a una base de datos si luego decidieras que realmente necesitabas una lógica de consulta relacional.




SQL Express de MS es una gran versión gratuita y liviana de su base de datos SQL Server. Podrías probar eso si vas por la ruta DB.

Alternativamente, puede simplemente crear conjuntos de datos dentro de la aplicación y serializarlos en xml, o puede usar algo como el Entity Framework recién creado que se incluye con .NET 3.5 SP1.




Yo recomendaría simplemente usar una base de datos. Recomendaría usar LINQ o una herramienta ORM para interactuar con la base de datos. Para aprender LINQ, echaría un vistazo a las publicaciones de Scott Guthrie. Creo que hay 9 de ellos todos juntos. Yo vinculé la parte 1 a continuación. Si desea utilizar una herramienta ORM, por ejemplo, nhibernate, le recomiendo que consulte los screencasts de verano de nHibernate. Son un buen recurso de aprendizaje para el nhibernate.

No estoy de acuerdo con el uso de XML. Con las estadísticas de informes sobre una gran cantidad de datos, no se puede superar el uso de una base de datos relacional. Sí, XML es liviano, pero también hay muchas opciones para bases de datos relacionales livianas, además de una implementación completa basada en servicios. (es decir, SQL Server Compact , SQLite , etc.)




Recomiendo guardar sus datos en POCO simples y serializarlos en xml o en un archivo binario, como hizo Brian anteriormente.

Si te gustan las bases de datos, te sugiero Sql Server Compact Edition , o VistaDB . Ambos están alojados inproc dentro de su aplicación.




No sé si una base de datos es necesariamente lo que quieres. Eso puede ser excesivo para almacenar estadísticas para un juego simple como ese. Las bases de datos son buenas; pero no debería usar automáticamente una en cada situación (supongo que esta es una aplicación cliente, no un juego en línea).

Personalmente, para un juego que solo existe en la computadora del usuario, simplemente almacenaría las estadísticas en un archivo (XML o binario; la elección depende de si desea que sea legible por el ser humano o no).




Para esta situación, el atributo [Serializable] en una clase de Stats bellamente modelada y XmlSerializer son el camino a seguir, IMO.




Aquí hay una idea: use serialización Xml. Diseña tu estructura de datos GameStats y, opcionalmente, utiliza atributos Xml para influir en el esquema a tu gusto. Me gusta usar este método para pequeños conjuntos de datos porque es rápido y fácil, y todo lo que necesito hacer es diseñar y manipular la estructura de datos.


using (FileStream fs = new FileStream(....))
{
    // Read in stats
    XmlSerializer xs = new XmlSerializer(typeof(GameStats));
    GameStats stats = (GameStats)xs.Deserialize(fs);

    // Manipulate stats here ...

    // Write out game stats
    XmlSerializer xs = new XmlSerializer(typeof(GameStats));
    xs.Serialize(fs, stats);

    fs.Close();
}



Si planea guardar en un archivo dentro del mismo directorio que su ejecutable, aquí tiene una buena solución que usa el formato JSON :

using System;
using System.IO;
using System.Web.Script.Serialization;

namespace MiscConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            MySettings settings = MySettings.Load();
            Console.WriteLine("Current value of 'myInteger': " + settings.myInteger);
            Console.WriteLine("Incrementing 'myInteger'...");
            settings.myInteger++;
            Console.WriteLine("Saving settings...");
            settings.Save();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        class MySettings : AppSettings<MySettings>
        {
            public string myString = "Hello World";
            public int myInteger = 1;
        }
    }

    public class AppSettings<T> where T : new()
    {
        private const string DEFAULT_FILENAME = "settings.json";

        public void Save(string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
        }

        public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));
        }

        public static T Load(string fileName = DEFAULT_FILENAME)
        {
            T t = new T();
            if(File.Exists(fileName))
                t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));
            return t;
        }
    }
}






c# .net