• Lunes 1 de Mayo de 2017, 00:37

Autor Tema:  Consultas sql en C#  (Leído 1292 veces)

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Consultas sql en C#
« en: Jueves 8 de Diciembre de 2016, 16:32 »
0

Publicidad 
Muy buenas tardes, estoy haciendo un programa que registra novedades como por ejemplo :
a.   La fecha.
b.   El empleado.
c.   Si se trata de inasistencia, llegada tarde o retiros anticipado.
d.   Si ha sido con aviso previo o no.
e.   Si se trata de módulos profesor, qué horas de la jornada están afectadas (las horas se numeran de la 1ª a la 9ª). Ejemplo: 05/10/16 – Ing. Gómez, Carlos – Ausente (Sin Aviso) – 1ª hora.
f.   Si se trata de cargos, el tipo del mismo. Ejemplo: 05/10/16 – Perré, Adrián – Retiro Anticipado (Con Aviso) – Cargo de Bedel.

Lo estoy haciendo con Windows Forms en visual basic 2015, y tengo los datos en una bd hecha en access, el principal problema que tengo es que nose como comparar lo ingresado en un textbox con un dato de la base de datos, por ejemplo: Ingreso un legajo en el textbox y quiero compararlo con la columna de legajos en la bd y si son iguales hacer alguna otra cosa.


Intente con este codigo pero tiene errores de sintaxis y me dice que txtLegajo es inaccesible por el nivel de protección.
Código: [Seleccionar]
string comando = "SELECT * FROM Personal WHERE Legajo LIKE'" + txtLegajo.text + '");

Desde ya muchas gracias.



EDIT:         Hola denuevo, le hice unos retoques al codigo me quedo asi:
   
Código: [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {
            string comando = "SELECT * FROM Personal WHERE Legajo LIKE'" + txtLegajo.Text + "')";
            if (comando)
            {
                Form2 segundo = new Form2();
                segundo.ShowDialog();
            }

me dice que no se puede convertir de string a bool, como hago?
Y otra cosa lo de la conexión con la bd donde la hago? en una clase aparte o dentro del mismo form.
« última modificación: Jueves 8 de Diciembre de 2016, 18:27 por Laxair »

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #1 en: Jueves 8 de Diciembre de 2016, 18:53 »
0
Hola, tienes un paréntesis cerrado al final y no veo uno abierto antes.
Estas asignando la instrucción SELECT al string comando pero no se donde la ejecutas para comprobar el resultado, no conozco Visual Basic pero me imagino que comando debes ejecutarlo en algún sitio y comprobar el resultado, en el código que pones comando valdrá el valor que le has asignado y no true/false.
« última modificación: Jueves 8 de Diciembre de 2016, 18:58 por chenech »

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #2 en: Jueves 8 de Diciembre de 2016, 19:04 »
0
Si el paréntesis fue error de tipeo, y lo otro no se como hacer la condición, osea yo quiero que si lo que pongo en el textbox es igual a lo que esta en la columna Legajo se abra el segundo formulario.Como debería hacer?

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #3 en: Jueves 8 de Diciembre de 2016, 19:35 »
0
Es que no se en Visual Basic como se ejecuta una sentencia SQL, deberias ejecutar la sentencia siguiente que te devuelve el contenido de Legajo y compararlo. Sería algo así, lo que no se como sejecuta.

Código: [Seleccionar]
"SELECT Legajo FROM Personal WHERE Legajo ='" + txtLegajo.Text + "'";
si(<Resultado de la SQL> es igual a txtLejago.Text)
  {
    Form2 segundo = new Form2();
    segundo.ShowDialog();
  }

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #4 en: Jueves 8 de Diciembre de 2016, 20:48 »
0
Mil perdones , no es visual basic es visual studio 2015.

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #5 en: Jueves 8 de Diciembre de 2016, 23:43 »
0
Hola de nuevo, no tengo compilador para probar pero prueba este código, en sbQuery asigno la sentencia SQL, luego se la asigno al comando a ejecutar y luego compruebo si es igual. antes asigna a conn el string de conexión.

Código: [Seleccionar]
               SqlCeConnection conn = new SqlCeConnection();
               StringBuilder sbQuery = new StringBuilder();
               SqlCeCommand cmd = new SqlCeCommand();
               IDataReader dr;

                sbQuery.Append("SELECT Legajo FROM Personal WHERE Legajo = " + txtLegajo.Text + "'");
                cmd.CommandText = sbQuery.ToString();
                cmd.Connection = conn;
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    if (dr["Legajo"].ToString() == txtLegajo.Text)
                   {
                     Form2 segundo = new Form2();
                     segundo.ShowDialog();
                   }
                }
                dr.Close();


« última modificación: Jueves 8 de Diciembre de 2016, 23:47 por chenech »

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #6 en: Viernes 9 de Diciembre de 2016, 16:02 »
0
Ese código que pusiste iría en el form? mas precisamente en el botón que tiene el formulario o en otra parte? Y otra cosa ese codigo se puede hacer con OledbConnection?
Y OleDbDataReader es lo mismo que IDataReader ???
Y una ultima cosa no entendi lo de asignar el string de conexion a conn  esta seria la ruta:   Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\*******\Desktop\Personal.accdb
« última modificación: Viernes 9 de Diciembre de 2016, 16:32 por Laxair »

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #7 en: Viernes 9 de Diciembre de 2016, 16:39 »
0
El ejemplo que te puse es de algo echo por mi hace mucho tiempo, ya no uso C#, fue echo para SQL CE de unas PDA, supongo que será equivalente al Ole pero no te lo puedo asegurar, si alguien por aquí domina el tema y opine mejor, y sí, en conn va el string de conexión que has puesto.
En cuanto a ponerlo en el Form o en el evento del click de ratón depende de como quieras, si lo haces en el click, abres la base de datos, compruebas y cierras la conexión, si lo hacen el el Form al crearlo, por ejemplo, define las variables generales y mantienes abierto el cursor a la base de datos hasta que tu quieras o se cierre el programa.
De todas formas, si alguien por aquí lee esto y conoce el C# mejor que opine, lo que te digo yo es de memoria y de hace años.
Un saludo.

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #8 en: Viernes 9 de Diciembre de 2016, 16:58 »
0
Me tira error el reader, dice que requiere una conexión abierta y disponible, pero ahí en la imagen creo que la tengo abierta.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #9 en: Viernes 9 de Diciembre de 2016, 17:08 »
0
Lo que veo distinto es que yo el string se lo muevo luego y no en la creación como tu, yo lo tengo así:

conn.ConnectionString = "Data Source= " + ruta + "ChenWM.sdf;";

Prueba a quitarlo de la declaración y añadirlo luego del new a ver.

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #10 en: Viernes 9 de Diciembre de 2016, 18:14 »
0
No entendí, luego de cual new? Y la declaración te referís a cadconexion?

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #11 en: Viernes 9 de Diciembre de 2016, 18:21 »
0
despues de
SqlCeConnection conn = new SqlCeConnection();

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #12 en: Viernes 9 de Diciembre de 2016, 20:53 »
0
Bueno lo que hice fue hacer un bloque try-catch :

Código: [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =\"C:\\Users\\AsusB85M-G\\Desktop\\Personal.accdb\"";
            StringBuilder sbQuery = new StringBuilder();
            OleDbCommand cmd = new OleDbCommand();
            OleDbDataReader lector;

            string consultaSQL = "SELECT Legajo FROM Personal WHERE Legajo = " + txtLegajo.Text + "'";
            cmd.CommandText = sbQuery.ToString();
            cmd.Connection = conn;

            try
            {
                conn.Open();
            }
            catch (Exception excepcion)
            {
                Console.Write(excepcion.Message);
                Console.ReadLine();
            }

            if (conn.State == ConnectionState.Open)
            {
               
                try
                {
                    lector = cmd.ExecuteReader();
                    while (lector.Read())
                    {
                        if (lector["Legajo"].ToString() == txtLegajo.Text)
                        {
                            Form2 segundo = new Form2();
                            segundo.ShowDialog();
                        }
                    }
                }
                catch (Exception excepcion)
                {
                    Console.Write(excepcion.Message);
                    Console.ReadLine();
                }

                conn.Close();

            }
        }
    }
}

Al primer if entra el de  if (conn.State == ConnectionState.Open) pero el segundo donde se desea comparar parece que no porque no me abre el formulario.

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #13 en: Viernes 9 de Diciembre de 2016, 21:47 »
0
Pon un else que display algo a ver si es que no existe el legajo

Código: [Seleccionar]
                        if (lector["Legajo"].ToString() == txtLegajo.Text)
                        {
                            Form2 segundo = new Form2();
                            segundo.ShowDialog();
                        }
                        else
                            ...

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #14 en: Viernes 9 de Diciembre de 2016, 21:53 »
0
Puse en el else que se abriera el segundo formulario y nada, la base de datos esta con datos ya, y puse el mismo legajo que aparece en ella.

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #15 en: Viernes 9 de Diciembre de 2016, 22:33 »
0
Holaaaaaaaaaaaaaaaaaaaaaaaaaaaaa alfin encontre lo que estaba mal gracias Chenech por la paciencia y la ayuda.
El error estaba en las comillas de :

Código: [Seleccionar]
string consultaSQL = "SELECT Legajo FROM Personal WHERE Legajo = " + txtLegajo.Text + "";
no llevaba comillas simples.

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #16 en: Sábado 10 de Diciembre de 2016, 00:22 »
0
Vaya, bueno por lo menos funcionó.
Un saludo.

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #17 en: Sábado 10 de Diciembre de 2016, 16:07 »
0
Tengo otra duda, ahora lo que quiero hacer es insertar datos desde los windows form a la bd tengo el siguiente codigo hasta ahora :

Código: [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =\"C:\\Users\\AsusB85M-G\\Desktop\\Personal.accdb\"";
            OleDbCommand cmd;
           

            string consultaSQL = "INSERT INTO InasistenciasJefatura (Legajo,Estado,Fecha,Cargo,Turno,Aviso) VALUES " + txtLeg.Text + ""+ txtEstado.Items + "" + txtFecha.Text +""+ Cargo.Items + ""+ txtTurno.Text  + "" + txtAviso.Text+ "" ;
            cmd = new OleDbCommand(consultaSQL, conn);
            cmd.Connection = conn;

            try
            {
                conn.Open();
            }
            catch (Exception excepcion)
            {
                Console.Write(excepcion.Message);
                Console.ReadLine();
            }

            if (conn.State == ConnectionState.Open)
            {

                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception excepcion)
                {
                    Console.Write(excepcion.Message);
                    Console.ReadLine();
                }

                conn.Close();


            }
        }
    }
}


Seguramente hay algún error en la consulta.


Ah y otra cosa si tengo mas de una tabla en la bd es necesario poner el nombre del archivo (Personal) y la tabla a usar? por ejemplo Personal.InasistenciasJefatura.
« última modificación: Sábado 10 de Diciembre de 2016, 16:09 por Laxair »

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #18 en: Sábado 10 de Diciembre de 2016, 16:59 »
0
aquí tienes un ejemplo de como lo hacía yo pasando los parámetros a la sentencia SQL, no debes ejecutar el Open() este es para consultas SELECT que devuelven resultado, para UPDATE e INSERT es con ExecuteNonQuery.
Código: [Seleccionar]
                    sbQuery = new StringBuilder("");
                    sbQuery.Append("INSERT INTO Inventario VALUES(@PAlmacen, @PFecha, @PArticulo, @PUnidades)");
                    cmd.CommandText = sbQuery.ToString();
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@PAlmacen", tbAlmacen.Text);
                    cmd.Parameters.AddWithValue("@PFecha", dtFecha.Value.Date);
                    cmd.Parameters.AddWithValue("@PArticulo", tbArticulo.Text);
                    cmd.Parameters.AddWithValue("@PUnidades", dUnidades);
                    cmd.Connection = conn;
                    cmd.ExecuteNonQuery();

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #19 en: Sábado 10 de Diciembre de 2016, 17:28 »
0
PAlmacen , PFecha , etc esos que son? son las columnas de la base de datos?

Y lo del Open(), no es que lo tengo que hacer siempre porque es para abrir la conexión?

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #20 en: Sábado 10 de Diciembre de 2016, 18:01 »
0
Perdón, si, el Open hay que hacerlo, estaba confundido.
@PAlmacen es el parámetro a pasar y tbAlmacen.Text es el valor del dato en el form.
En el INSERT no pongo los datos de la base de datos por que se los paso igual que están en la BD, podría ser así también:

sbQuery.Append("INSERT INTO Inventario (Almacen, Fecha, Articulo, Unidades) VALUES(@PAlmacen, @PFecha, @PArticulo, @PUnidades)");

También vale como lo has puesto tu, a mi me gusta más por parámetros para hacer mas legible el código:

string consultaSQL = "INSERT INTO InasistenciasJefatura (Legajo,Estado,Fecha,Cargo,Turno,Aviso) VALUES " + txtLeg.Text + ""+ txtEstado.Items + "" + txtFecha.Text +""+ Cargo.Items + ""+ txtTurno.Text  + "" + txtAviso.Text+ "" ;

string consultaSQL = "INSERT INTO InasistenciasJefatura (Legajo, Estado, Fecha, Cargo, Turno, Aviso) VALUES (@Legajo, @Estado, @Fecha, @Cargo, @Turno, @Aviso)";

Ahí tienes ejemplos de datos alfanuméricos, fecha y numérico.
« última modificación: Sábado 10 de Diciembre de 2016, 18:07 por chenech »

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #21 en: Sábado 10 de Diciembre de 2016, 18:12 »
0
Lo puse de la siguiente forma:

Código: [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =\"C:\\Users\\AsusB85M-G\\Desktop\\Personal.accdb\"";
            OleDbCommand cmd;


            //string consultaSQL = "INSERT INTO InasistenciasJefatura (Legajo,Estado,Fecha,Cargo,Turno,Aviso) VALUES " + txtLeg.Text + ""+ txtEstado.Items + "" + txtFecha.Text +""+ Cargo.Items + ""+ txtTurno.Text  + "" + txtAviso.Text+ "" ;
            string consultaSQL = "INSERT INTO Inventario (Legajo, Estado, Fecha, Cargo, Turno, Aviso) VALUES(@Legajo, @Estado, @Fecha, @Cargo, @Turno, @Aviso)";
            cmd = new OleDbCommand(consultaSQL, conn);
            cmd.Connection = conn;
            cmd.Parameters.AddWithValue("@Legajo", txtLeg.Text);
            cmd.Parameters.AddWithValue("@Estado", txtEstado.Items);
            cmd.Parameters.AddWithValue("@Fecha", txtFecha.Text);
            cmd.Parameters.AddWithValue("@Cargo", Cargo.Items);
            cmd.Parameters.AddWithValue("@Aviso", txtAviso.Text);
            try
            {
                conn.Open();
            }
            catch (Exception excepcion)
            {
                Console.Write(excepcion.Message);
                Console.ReadLine();
            }

            if (conn.State == ConnectionState.Open)
            {
               
                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception excepcion)
                {
                    Console.Write(excepcion.Message);
                    Console.ReadLine();
                }

                conn.Close();


            }

Y no funciona, si en la bd hay varias tablas hay que poner el nombre del archivo .Nombre_de_tabla_a_usar  o con solo poner el nombre de la tabla tendría que funcionar?

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #22 en: Sábado 10 de Diciembre de 2016, 18:22 »
0
Te puse un ejemplo, cambia la tabla y los campos por los de tu base de datos.
Inventario por InasistenciasJefatura y los campos de tu tabla y pasa los parámetros tuyos.

Laxair

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #23 en: Sábado 10 de Diciembre de 2016, 18:28 »
0
En el mensaje anterior te puse el código ya había cambiado todo.

EDIT:   
Código: [Seleccionar]
private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =\"C:\\Users\\AsusB85M-G\\Desktop\\Personal.accdb\"";
            OleDbCommand cmd;


            //string consultaSQL = "INSERT INTO InasistenciasJefatura (Legajo,Estado,Fecha,Cargo,Turno,Aviso) VALUES " + txtLeg.Text + ""+ txtEstado.Items + "" + txtFecha.Text +""+ Cargo.Items + ""+ txtTurno.Text  + "" + txtAviso.Text+ "" ;
            string consultaSQL = "INSERT INTO InasistenciaJefatura (Legajo, Estado, Fecha, Cargo, Turno, Aviso) VALUES (@Legajo, @Estado, @Fecha, @Cargo, @Turno, @Aviso)";
            cmd = new OleDbCommand(consultaSQL, conn);
            cmd.Connection = conn;
           
            try
            {
                conn.Open();
            }
            catch (Exception excepcion)
            {
                Console.Write(excepcion.Message);
                Console.ReadLine();
            }

            if (conn.State == ConnectionState.Open)
            {
               
                try
                {
                    cmd.Parameters.AddWithValue("@Legajo", txtLeg.Text);
                    cmd.Parameters.AddWithValue("@Estado", txtEstado.Items);
                    cmd.Parameters.AddWithValue("@Fecha", txtFecha.Text);
                    cmd.Parameters.AddWithValue("@Cargo", Cargo.Items);
                    cmd.Parameters.AddWithValue("@Aviso", txtAviso.Text);
                    cmd.ExecuteNonQuery();
                }
                catch (Exception excepcion)
                {
                    Console.Write(excepcion.Message);
                    Console.ReadLine();
                }

                conn.Close();


            }
« última modificación: Sábado 10 de Diciembre de 2016, 20:03 por Laxair »

chenech

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Consultas sql en C#
« Respuesta #24 en: Sábado 10 de Diciembre de 2016, 20:12 »
0
Pon el código sin los bloques try catch para si te da error ver donde es.