A
AlexMnrs
Beta
Verificación en dos pasos activada
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Depende de la complejidad de de la base de datos que hayas diseñado y las relaciones entre tablas podrías optar como bien estas intentando por almacenar los datos en un archivo de texto plano.
Ahora respecto al tema de base de datos los usuarios no tendrán su propia base de datos por que primero deberían de tener instalado el gestor de base de datos, bien sea el sql server o mysql o cualquier otro.
Una de las opciones es integrar en el instalador del programa el del gestor de base de datos de manera que se lo instalas automáticamente al cliente y cargas ahí la base de datos.
Otra opción es usar una base de datos embebida. Estas base de datos no requieren de gestor de base de datos propiamente dicho ya que son muy livianas y van incluidas dentro del proprio programa y por tanto no tienes que instalarle nada al usuario. Un ejemplo de estas base de datos es apache derby.
Yo tampoco me metería a marearme con una base de datos para una app tan pequeña y mas si estas trasteando.
Sin duda lo de la base de datos embebida a mi también me parece la mejor opción. Yo hice una pequeña app a modo de catalogo de películas y la hice así, aunque la verdad me llevo bastantes horas de investigación para hacerla funcionar correctamente.
Para estas base de datos o bien puedes buscar base de datos embebidas que supongo habrá varios tipos o puedes mirarte directamente apache derbi que es la que yo utilice. Prácticamente apenas notaras diferencia respecto a como funciona sql (yo empece la app usando sql server y al final la cambie por una de apache derbi embebida).
Y no entiendo muy bien que problema tienes con el guardar/recuperar los datos desde un archivo. Si especificas un poco mas cual es tu duda o problema te podre ayudar.
El guardar y recuperar datos de un archivo es bastante sencillo e imagino existen librerías que te parsean el xml, aunque a mi me gusta trabajar con .json, mas si esta orientado a objetos.
Echare un ojo a ver si encuentro entre mis favoritos algo de apache derbi que creo que vi algún tuto interesante en su momento.
Si quieres abrir una base de datos en una versión menor no abrirá .. Ni a tiros procura usar una versión estándar como sql 2008 r2
Amigo evita tanto problema usando Microsoft Access, te sera mas cómodo y podrás incluirlo dentro de la carpeta de la aplicación.
He estado haciendo unas búsquedas y por lo que veo utilizan mucho SQLite como base de datos embebida para trabajar en visual.
https://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1
Mírate SQLite que seguramente encontraras mas documentación y te sera mas fácil de implementar.
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.15.0;Data Source=Contactos.mdb;Persist Security Info=False;";
Con access nunca he trabajado así que no tengo ni la mas remota idea, aunque sinceramente, diría que es un atraso seguir usando access a día de hoy, que de seguro hay mejores soluciones.
Aunque eso es como todo, todavía veo empresas a día de hoy trabajando con excel como si fuera una base de datos así que imagínate...
Con SQLite se trabaja mucho en app android y esta bastante extendido, pero no se a nivel de .NET que tan usado es, pues hace 2 años que no toco nada de .NET
Con una búsqueda rápida en youtube he visto varios tutos usando sqlite en C#, asi que no creo que tengas muchos problemas.
using System;
using System.Data;
using System.Windows.Forms;
using Finisar.SQLite;
namespace SQLiteTest
{
public partial class Form1 : Form
{
string mDbPath = Application.StartupPath + "/Contactos.db";
SQLiteConnection con;
SQLiteCommand cmd;
SQLiteDataAdapter da;
DataTable dt;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
con = new SQLiteConnection("Data Source=" + mDbPath + "; Version = 3; New = True; Compress = True;");
con.Open();
using (SQLiteCommand cmd = new SQLiteCommand(@"CREATE TABLE IF NOT EXISTS
Contactos (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
'nombre' VARCHAR(50), 'apellido' VARCHAR(50), 'movil' VARCHAR(50), 'email' VARCHAR(50), 'categoria' VARCHAR(50);", con))
{
cmd.ExecuteNonQuery();
MessageBox.Show("Tabla creada.");
}
}
private void CargarDatos()
{
try
{
dt = new DataTable();
string cadena = "SELECT * FROM Contactos;";
cmd = new SQLiteCommand(cadena, con);
da = new SQLiteDataAdapter(cmd);
da.Fill(dt);
// Disabling counter field for edition because it can throw exception
if (dt.Columns.Contains("id"))
{
dt.Columns["id"].ReadOnly = true;
}
//dgvDatos.DataSource = dt;
dataGridView1.Rows.Clear();
foreach (DataRow item in dt.Rows)
{
int n = dataGridView1.Rows.Add();
dataGridView1.Rows[n].Cells[0].Value = item[0].ToString();
dataGridView1.Rows[n].Cells[1].Value = item[1].ToString();
dataGridView1.Rows[n].Cells[2].Value = item[2].ToString();
dataGridView1.Rows[n].Cells[3].Value = item[3].ToString();
dataGridView1.Rows[n].Cells[4].Value = item[4].ToString();
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message.ToString());
}
}
private void btnCargar_Click(object sender, EventArgs e)
{
CargarDatos();
}
}
}
Ahora mismo estoy desde el móvil y no puedo mirarlo, pero en vez de usar IF NOT EXiST prueba hacerlo mediante un if normal haciendo una consulta para ver si existe, que puede que no lo este cogiendo bien.
Te da algún fallo? O simplemente no hace nada?
- - - Actualizado - - -
Ahora mismo estoy desde el móvil y no puedo mirarlo, pero prueba a comprobar si existe la base de datos mediante una consulta en un if normal, que puede que no te esté cogiendo el IF NOT EXIST.
Te d algún fallo? O solo no hace nada?
using(SQLiteConnection con =newSQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;"))using(SQLiteCommand command = con.CreateCommand())
{
con.Open();
command.CommandText="SELECT name FROM sqlite_master WHERE name='account'";
var name = command.ExecuteScalar();
// check account table exist or not
// if exist do nothing
if(name !=null&& name.ToString()=="account")
return;
// acount table not exist, create table and insert
command.CommandText="CREATE TABLE account (rowID INT, user VARCHAR(20), pass VARCHAR(20))";
command.ExecuteNonQuery();
command.CommandText="INSERT INTO account (rowID, user, pass) VALUES (0, '', '')";
command.ExecuteNonQuery();
}
Te pego un código que he visto en stackoverflow:
Como ves, ahi lo que hace es primero consultar a sqlite_master que es donde esta el nombre de todas las tablas de la base de datos, si hay una con el nombre de la que quieres probar.
Luego analiza ese resultado, de que si es distinto de null (existe alguna tabla) y se llama como la que buscas (teóricamente con el where de la consulta te garantiza que si te da un resultado sera ese así que no entiendo por que vuelve a comprobar eso ahí pero bueno), hace un return para cortar la ejecución ya que la tabla existirá.
En caso de que no entrara por ese if, ejecutaría las sentencias de creación de tabla y de inserción de un valor.
Prueba hacerlo así, y mete el mensaje box al final para confirmar que se ha creado.
Fuera parte de eso, te recomendaría que los nombres de las tablas sean todos en minúsculas, te evitara dolores de cabeza
private void Form1_Load(object sender, EventArgs e)
{
using (SQLiteConnection conex = new SQLiteConnection("Data Source=" + mDbPath + ";Version = 3; New = True; Compress = True;"))
using (SQLiteCommand command = conex.CreateCommand())
{
conex.Open();
command.CommandText = "SELECT name FROM sqlite_master WHERE name='contactos'";
var name = command.ExecuteScalar();
// check account tale exist or not
//if exist do nothing
if (name != null && name.ToString() == "contactos")
{
MessageBox.Show("La tabla contactos existe.");
return;
}
// account table not exist, create table and insert
command.CommandText = "CREATE TABLE IF NOT EXISTS contactos(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nombre VARCHAR(50) NOT NULL, apellido VARCHAR(50), movil VARCHAR(50) NOT NULL, email VARCHAR(50), categoria VARCHAR(50))";
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO contactos (id, nombre, apellido, movil, email, categoria) VALUES (0, 'alex', 'rodriguez', 66666666, 'test@gmail.com', 'PERSONAL')";
command.ExecuteNonQuery();
MessageBox.Show("La tabla contactos ha sido creada.");
}
//con = new SQLiteConnection("Data Source=" + mDbPath + ";Version = 3; New = True; Compress = True;");
//con.Open();
//using (SQLiteCommand cmd = new SQLiteCommand(@"CREATE TABLE IF NOT EXISTS
//contactos (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
//nombre VARCHAR(50) NOT NULL, apellido VARCHAR(50), movil VARCHAR(50) NOT NULL, email VARCHAR(50), categoria VARCHAR(50))", con))
//{
// cmd.ExecuteNonQuery();
// MessageBox.Show("Tabla creada.");
//}
}
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?