C sharp - Problemas con un CRUD en Visual C# con SQLite.

 
Vista:
sin imagen de perfil
Val: 3
Ha aumentado su posición en 19 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Problemas con un CRUD en Visual C# con SQLite.

Publicado por ESC (2 intervenciones) el 04/10/2020 14:41:00
Hola a todos, tengo un problemita con un CRUD que estoy haciendo en Visual C#
resulta que cuando hago doble click en el DataGrid me sale este error.
Uso como motor para mi base de datos SQLite.

"Información adicional: El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección"

Tambien me un error aparece cuando voy a Modificar/Actualizar un registro que es el siguiente:

"Información adicional: SQL logic error or missing database

near "3": syntax erro
r"

Mi database funciona correctamente porque me permite guardar y borrar registros, bueno eso creo...

Actualmente mi código es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
namespace CRUD_SQLite
{
    public partial class frm_inicio : Form
    {
        public frm_inicio()
        {
            InitializeComponent();
        }
 
        // Definimos las variables que moveran las base de datos de SQlite.
        private SQLiteConnection sql_con;
        private SQLiteCommand sql_cmd;
        private SQLiteDataAdapter da;
        private DataSet ds = new DataSet();
        private DataTable dt = new DataTable();
 
        void set_connection() // Establecemos la conexion a la base de datos local.
    {
 
        sql_con = new SQLiteConnection ("data source=contactos.db"); // El archivo .db debe estar ubicado en la carpeta Debug.
 
    }
 
        void execute_query(string text_query)
        {
            set_connection();
            sql_con.Open(); // Abrimos la conexion.
            sql_cmd = sql_con.CreateCommand(); // Creamos los comandos.
            sql_cmd.CommandText = text_query; // Como comandos elegimos a text_query que los almacenara.
            sql_cmd.ExecuteNonQuery(); // Ejecutamos la consulta.
            sql_con.Close(); // Cerramos los comandos.
        }
 
        void load_db()
        {
            set_connection();
            sql_con.Open(); // Abrimos los comandos para SQLite.
            sql_cmd = sql_con.CreateCommand(); // Creamos el comando
            string command_text = "select * from contactos"; // El comando debe ser una variable tipo string, despues del *from colocamos el nombre de la tabla a utilizar.
            da = new SQLiteDataAdapter(command_text, sql_con); // Creamos un DataAdapter para  el DataGrid.
            ds.Reset();
            da.Fill(ds);
            dt = ds.Tables[0];
            dgv_datos.DataSource = dt; // Colocamos el nombre de nuestra DataGrd y como data source le colocamos el que hicimos.
            sql_con.Close();
        }
        private void frm_inicio_Load(object sender, EventArgs e)
        {
         load_db(); // Cargamos en el Form los datos.
        }
 
        private void btn_guardar_Click(object sender, EventArgs e)
        {
            string text_query = "insert into contactos(ID,Nombres,Apellidos,Telefono,Correo)values('" + txt_id.Text + "','" + txt_nombres.Text + "','" + txt_apellidos.Text + "','" + txt_telefono.Text + "','" + txt_correo.Text + "')";
            execute_query(text_query);
            load_db();
        }
 
        private void btn_eliminar_Click(object sender, EventArgs e)
        {
            string text_query = "delete from contactos where ID='" + txt_id.Text + "'";
            execute_query(text_query);
            load_db();
        }
 
        private void btn_editar_Click(object sender, EventArgs e)
        {
            string text_query = "update clientes set Nombres ='" + txt_nombres.Text + "', Apellidos ='" + txt_apellidos.Text + "', Telefono ='" + txt_telefono.Text + "', Correo ='" + txt_correo.Text + "''where ID='" + txt_id.Text + "'";
            execute_query(text_query);
            load_db();
        }
 
        private void dgv_datos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
           txt_id.Text = dgv_datos.SelectedRows[0].Cells[0].Value.ToString();
           txt_nombres.Text = dgv_datos.SelectedRows[0].Cells[1].Value.ToString();
           txt_apellidos.Text = dgv_datos.SelectedRows[0].Cells[2].Value.ToString();
           txt_telefono.Text = dgv_datos.SelectedRows[0].Cells[3].Value.ToString();
           txt_correo.Text = dgv_datos.SelectedRows[0].Cells[4].Value.ToString();
        }
 
      }
 
}

y la tabla que uso en SQLite es la siguiente:
1
2
3
4
5
6
7
CREATE TABLE "contactos" (
	"ID"	INTEGER UNIQUE,
	"Nombres"	TEXT,
	"Apellidos"	TEXT,
	"Telefono"	NUMERIC,
	"Correo"	TEXT,
	PRIMARY KEY("ID")

Aqui algunas imagenes del error que me sale:

ERROR1

Aveces tambien me sale este error.

erro2

Tambien aveces al compilarlo con solo dar un click al DataGrid para reflejar los datos en los textobox
me da error :(

Esta es la interfaz del Form

Form

Agradeceria su ayuda colegas, soy nuevo en C#, vengo de Visual Basic que es muy diferente de C# por cierto...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problemas con un CRUD en Visual C# con SQLite.

Publicado por Nacho (115 intervenciones) el 04/10/2020 18:25:31
Si la cantidad de filas seleccionadas es 0 no puedes invocar a dgv_datos.SelectedRows[0].Cells[0].Value porque te dará ese error.

El ID de una fila, más que un UNIQUE, lo que suele ser es un no permitido null y autoincrement. Si lo tienes como UNIQUE si e intentas meterle un valor que ya existe te dará ese error.

Tienes que aprender a debuggear.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar