none
error en consulta RRS feed

  • Pregunta

  • Amigos

    cuando escribo esta consulta en Mysql me da 8456 registros la misma consulta la llevo a c# me da 17890

    no se que esta mal

    select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid, txgl.a.submuluid, txgl.f.name as familia, txgl.f.namees, txgl.a.baozhuangshu, txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong,
    (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype
                            from txgl.articulo a, tmp_art_kind f, art_precio ap
    			where f.bianhao = a.muluid and kind <>"Español" and ap.codigo = a.codigo and ap.ptype = 1 
    			and (f.bianhao = "001" or f.bianhao = "003" or f.bianhao = "007"
                            or f.bianhao = "013" or f.bianhao = "005" or f.bianhao = "014" or f.bianhao = "019" or f.bianhao= "021" or f.bianhao = "024")

    este es el codigo

     private void cargarquerytodojuntos()
            {
                using (MySqlConnection cnges = new MySqlConnection(sqlconnection))
                {
                    try
                    {
                        cnges.Open();
                        string queryy = @"select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid as familia, txgl.a.submuluid as subfamilia, txgl.a.baozhuangshu,                     txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong,
                                        (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype
                                     from txgl.articulo a, tmp_art_kind f, art_precio ap
    			                    where f.bianhao = a.muluid and kind <> 'Español' and ap.codigo = a.codigo and ap.ptype = 1 
    			                        and (f.bianhao = '001' or f.bianhao = '003' or f.bianhao = '007'
                                            or f.bianhao = '013' or f.bianhao = '005' or f.bianhao = '014' or f.bianhao = '019' or f.bianhao= '021' or f.bianhao = '024')";
    
                        MySqlCommand cmd = new MySqlCommand(queryy, cnges);
                     
                        var datatable = new DataTable();
                        var mySqlDataAdapter = new MySqlDataAdapter(cmd);
                        mySqlDataAdapter.Fill(datatable);
    
                        List<string> lista = new List<string>();
                        MySqlDataReader reader = cmd.ExecuteReader();
    
            
    
    
                        while (reader.Read())
                        {
                            lista.Add(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}", reader["bianhao"], reader["codigo"], reader["namecn"], reader["familia"], reader["subfamilia"], reader["baozhuangshu"], reader["precio"], reader["Kucun"], " ", " ", "21", reader["jinyong"], reader["despues_descuento10"]));
                           
                           
    
                        }
    
                        //Genera tu archivo con la lista
                        //File.WriteAllLines(@"D:\Dropbox\dipo\manualidades.csv", lista);
    
                        File.WriteAllLines(@"D:\ImagenB\exportacion.csv", lista);
                        /

    saludos


    ruben

    jueves, 21 de abril de 2016 15:42

Respuestas

  • Así como lo tiene parece que "lista" está declarado fuera del método cargarquerytodojuntos().  Además no veo lista.clear() antes del while(reader.Read()).  Concluyo entonces que se le duplica en 2 pruebas consecutivas:  La primera carga 9000, luego otros 9000.  Si hiciera una tercera prueba, serían 27000, etc.

    Pienso que debería declarar lista antes del while y listo:

    List<string> lista = new List<string>();
    while (reader.Read())
    ...

    Ah, y el reader implementa IDisposable.  Debería usar using (MySqlDataReader reader = cmd.ExecuteReader()), tal y como lo hace con la conexión.  Y creo que el MySqlCommand también.  Verifique.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 17:06
    Moderador
  • Por la ñ de Español en el filtro? No debería, qué. Tipo campo es? Es de tipo cadena pero qué codificación tiene? Si cambias la condición te devuelve los registros correctos? Para verificareso que dices

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 17:27
    Moderador
  • lo primero para probar es comentar esta parte

    var datatable = new DataTable();
                        var mySqlDataAdapter = new MySqlDataAdapter(cmd);
                        mySqlDataAdapter.Fill(datatable);

    hazlo y nos dices ok?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 16:58
    Moderador

Todas las respuestas

  • hola. Apuntas en tu aplicativo c# a la misma bbdd que la que has ejecutado la query?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 15:55
    Moderador
  • si, Sergio


    ruben

    jueves, 21 de abril de 2016 15:57
  • se puede mejorar la consulta? 

    ruben

    jueves, 21 de abril de 2016 15:58
  • viendo tu codigo no entiendo muy bien por qué ejecutas la consulta para cargar un DataTable y luego la ejecutas de nuevo para cargar una lista. Dicho esto, supongo que se podrá mejorar. No soy dba pero veo que el ultimo and se podría escribir

    and f.bianhao in( "001","003","007","013","005","014","019", "021","024")


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 16:06
    Moderador
  • luego tendrás que ver si necesitas algún indice sobre el que realizar la consulta. Por ejemplo en el campo bianhao de la tabla tmp_art_kind

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 16:09
    Moderador
  • Sergio he visto el problema y es que en la Bd la descripcion se separa por coma ,  

    entonces al crear mi lista me separa y genera mas grande la lista

                            lista.Add(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}", reader["bianhao"], reader["codigo"], reader["namecn"], reader["familia"], reader["subfamilia"], reader["baozhuangshu"], reader["precio"], reader["Kucun"], " ", " ", "21", reader["jinyong"], reader["despues_descuento10"]));


    ruben

    jueves, 21 de abril de 2016 16:23
  • No no es ese el problema mi amigo

    se duplica al recorrer para crear el list

    saludos


    ruben

    jueves, 21 de abril de 2016 16:28
  • por favor mi amigo necesito mejorar esto

     private void cargarquerytodojuntos()
            {
                using (MySqlConnection cnges = new MySqlConnection(sqlconnection))
                {
                    try
                    {
                        cnges.Open();
                        string queryy = @"select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid as familia, txgl.a.submuluid as subfamilia, txgl.a.baozhuangshu,                     txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong, (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype
                                     from txgl.articulo a, tmp_art_kind f, art_precio ap
    		 	                     where f.bianhao = a.muluid and f.kind <> 'Español' and ap.codigo = a.codigo and ap.ptype = 1 
    			                     and f.bianhao in('001','003','007','013','005','014','019', '021','024')";
    
                        MySqlCommand cmd = new MySqlCommand(queryy, cnges);
                     
                        var datatable = new DataTable();
                        var mySqlDataAdapter = new MySqlDataAdapter(cmd);
                        mySqlDataAdapter.Fill(datatable);
    
                       
                        MySqlDataReader reader = cmd.ExecuteReader();
    
                        while (reader.Read())
                        {
                            lista.Add(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}", reader["bianhao"], reader["codigo"], reader["namecn"], reader["familia"], reader["subfamilia"], reader["baozhuangshu"], reader["precio"], reader["Kucun"], " ", " ", "21", reader["jinyong"], reader["despues_descuento10"]));
                        
                        }
    
                        //Genera tu archivo con la lista
                        //File.WriteAllLines(@"D:\Dropbox\dipo\manualidades.csv", lista);
    
                        File.WriteAllLines(@"D:\ImagenB\exportacion.csv", lista);
                        cnges.Close();
                    }
                    catch (MySqlException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }


    ruben

    jueves, 21 de abril de 2016 16:30
  • qué quieres mejorar? La velocidad de acceso a datos? Tu método?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 16:32
    Moderador
  • el metodo Sergio

    no funciona me duplica los archivos


    ruben

    jueves, 21 de abril de 2016 16:41
  • Cuando dice "me duplica los archivos", o bien cuando dice "me devuelve 17890 registros", ¿en qué parte del código está haciendo la comprobación?  Porque eso es fundamental.

    Si quiere saber si MySQL está devolviendo eso o no realmente, lo que le recomiendo es que examine el total de filas del datatable.


    Jose R. MCP
    Code Samples

    jueves, 21 de abril de 2016 16:57
    Moderador
  • lo primero para probar es comentar esta parte

    var datatable = new DataTable();
                        var mySqlDataAdapter = new MySqlDataAdapter(cmd);
                        mySqlDataAdapter.Fill(datatable);

    hazlo y nos dices ok?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 16:58
    Moderador
  • Sergio lo tengo asi y sigue duplicando

       private void cargarquerytodojuntos()
            {
                using (MySqlConnection cnges = new MySqlConnection(sqlconnection))
                {
                    try
                    {
                        cnges.Open();
                        string queryy = @"select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid as familia, txgl.a.submuluid as subfamilia, txgl.a.baozhuangshu,                     txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong, (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype
                                     from txgl.articulo a, tmp_art_kind f, art_precio ap
    		 	                     where f.bianhao = a.muluid and f.kind <> 'Español' and ap.codigo = a.codigo and ap.ptype = 1 
    			                     and f.bianhao in('001','003','007','013','005','014','019', '021','024')";
    
                        MySqlCommand cmd = new MySqlCommand(queryy, cnges);
                       
                        MySqlDataReader reader = cmd.ExecuteReader();
                       
                        while (reader.Read())
                        {
                            lista.Add(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}", reader["bianhao"], reader["codigo"], reader["namecn"], reader["familia"], reader["subfamilia"], reader["baozhuangshu"], reader["precio"], reader["Kucun"], " ", " ", "21", reader["jinyong"], reader["despues_descuento10"]));
                        
                        }
    
                        //Genera tu archivo con la lista
                        //File.WriteAllLines(@"D:\Dropbox\dipo\manualidades.csv", lista);
    
                        File.WriteAllLines(@"D:\ImagenB\exportacion.csv", lista);
                        cnges.Close();
                    }
                    catch (MySqlException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }

    pero la consulta Sql esta perfecta

    me muestra 9000 solo al crear la lista es el problema

    Saludos


    ruben

    jueves, 21 de abril de 2016 17:02
  • La cantidad de Linea lo verifico en mi sqlyog


    ruben

    jueves, 21 de abril de 2016 17:04
  • declara

    int rowCount = 0; antes de bucle y dentro de el la incrementas

    rowCount++;

    pon un punto de ruptura al salir del bucle Read() y visualiza el contenido de esta variable...


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 17:05
    Moderador
  • Así como lo tiene parece que "lista" está declarado fuera del método cargarquerytodojuntos().  Además no veo lista.clear() antes del while(reader.Read()).  Concluyo entonces que se le duplica en 2 pruebas consecutivas:  La primera carga 9000, luego otros 9000.  Si hiciera una tercera prueba, serían 27000, etc.

    Pienso que debería declarar lista antes del while y listo:

    List<string> lista = new List<string>();
    while (reader.Read())
    ...

    Ah, y el reader implementa IDisposable.  Debería usar using (MySqlDataReader reader = cmd.ExecuteReader()), tal y como lo hace con la conexión.  Y creo que el MySqlCommand también.  Verifique.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 17:06
    Moderador
  • tal vez no tes esté duplicando los registros sino que por cada registro completo de la consulta te genera el listview dos filas porque estas visualizando muchos campos. Agrega únicamente dos o tres campos a la lista

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 17:08
    Moderador
  • Tiene sentido lo dicho por webJose...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 17:10
    Moderador
  •  using (MySqlConnection cnges = new MySqlConnection(sqlconnection))
                {
                    try
                    {
                        cnges.Open();
    //                    string queryy = @"select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid as familia, txgl.a.submuluid as subfamilia, txgl.a.baozhuangshu,                     txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong, (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype
    //                                 from txgl.articulo a, tmp_art_kind f, art_precio ap
    //		 	                     where f.bianhao = a.muluid and f.kind <> 'Español' and ap.codigo = a.codigo and ap.ptype = 1 
    //			                     and f.bianhao in('001','003','007','013','005','014','019', '021','024')";
    
    //                    MySqlCommand cmd = new MySqlCommand(queryy, cnges);
    
                        MySqlDataAdapter sql = new MySqlDataAdapter(@"select txgl.a.bianhao, txgl.a.codigo, txgl.a.namecn, txgl.a.muluid as familia, txgl.a.submuluid as subfamilia, txgl.a.baozhuangshu, txgl.ap.precio, txgl.a.kucun, txgl.a.jinyong, (txgl.ap.precio * 0.90) as despues_descuento10, txgl.a.weizhi, txgl.a.tuijian, ap.ptype from txgl.articulo a, tmp_art_kind f, art_precio ap
                          where f.bianhao = a.muluid and f.kind <> 'Español' and ap.codigo = a.codigo and ap.ptype = 1
                          and f.bianhao in('001','003','007','013','005','014','019', '021','024')", cnges);
                        //MySqlDataReader reader = cmd.ExecuteReader();
                        
                        DataTable dt = new DataTable();
    
                        sql.Fill(dt);
                        
                        //while (sql.Read())
                        //{
                        //    lista.Add(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}", reader["bianhao"], reader["codigo"], reader["namecn"], reader["familia"], reader["subfamilia"], reader["baozhuangshu"], reader["precio"], reader["Kucun"], " ", " ", "21", reader["jinyong"], reader["despues_descuento10"]));
                        
                        //}
    
                        //Genera tu archivo con la lista
                        //File.WriteAllLines(@"D:\Dropbox\dipo\manualidades.csv", lista);
    
                        File.WriteAllLines(@"D:\ImagenB\exportacion.csv", lista);
                        cnges.Close();

    he echo esto

    Como puedo hacer para saber la cantidad de registro de datatable


    ruben

    jueves, 21 de abril de 2016 17:15
  • esta claro amigos algo pasa en la consulta cuando traigo a c#



    ruben

    jueves, 21 de abril de 2016 17:18
  • en realidad tengo los 18000 pero tiene que ser solo la mitad por que el los codigo se repiten dos veces por eso lo divido por español, no hace lo de distinto a Español


    ruben

    jueves, 21 de abril de 2016 17:20
  • En el Motor si funciona pero en C# no


    ruben

    jueves, 21 de abril de 2016 17:20
  • creo descubrir que es por la ñ

    ruben

    jueves, 21 de abril de 2016 17:22
  • Eso es casi imposible... Si la consulta es la misma y la realizas apuntando a la misma bbdd de la que haces la consulta a MySQL el resultado debe ser el mismo. No conozco MySQL, tiene algún sistema de traza en la que puedas visualizar qué consulta estas enviando desde c#? Piensa que si ocurre lo que dices toda aplicación generada con c# o .net contra MySQL duplicarian registros. Puedes verificar la cadena de conexión?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de abril de 2016 17:23
    Moderador
  • Como lo podría solucionar


    ruben

    jueves, 21 de abril de 2016 17:23
  • Listo amigo

    ahora como vuelvo a crear mi lista recorriendo mi data table

    saludos


    ruben

    jueves, 21 de abril de 2016 17:26
  • Por la ñ de Español en el filtro? No debería, qué. Tipo campo es? Es de tipo cadena pero qué codificación tiene? Si cambias la condición te devuelve los registros correctos? Para verificareso que dices

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ruben Lezcano domingo, 24 de abril de 2016 9:20
    jueves, 21 de abril de 2016 17:27
    Moderador
  • Coincido con Sergio:  Eso es imposible bajo la suposición de que todo trabaja.  Creo que esto ya se volvió un caso de soporte para la gente de MySQL.  Le recomendaría buscar el foro de soporte de esta base de datos.

    Jose R. MCP
    Code Samples

    jueves, 21 de abril de 2016 17:27
    Moderador
  • Listo amigo

    ahora como vuelvo a crear mi lista recorriendo mi data table

    saludos


    ruben

    ¿Dice usted que ya le funciona bien la consulta desde C#?  Si es así, ubique mi sugerencia de declarar la lista justo antes del while.  Aplique esos consejos en el código que mostró justo antes de esa respuesta mía y voilá, tendrá su lista de strings.

    Jose R. MCP
    Code Samples

    jueves, 21 de abril de 2016 17:36
    Moderador
  • Muchas gracias Jose y Sergio, gracias por estar ahí

    Funciona Perfecto

    Saludos


    ruben

    viernes, 22 de abril de 2016 7:33
  • Rubén, no olvide marcar las respuestas que le ayudaron.  Cortesía para los profesionales que invertimos el tiempo ayudando. :-)


    Jose R. MCP
    Code Samples

    viernes, 22 de abril de 2016 13:40
    Moderador