none
No se puede utilizar como método el miembro 'System.Data.DataTable.Rows' no invocable RRS feed

  • Pregunta

  • saludos amigos del foro, les traigo un inconveniente, este codigo lo pase de vb a c#, tengo un problema, les dejo de muestra del codigo y un pantallazo, por favor si me pueden ayudar, el error esta en negrita y en el pantallazo podran ver el codigo y gracias.

            public static void GetRichTextBox(int id)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                    {
                        var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);

                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        con.Open();

                        DataTable Table = new DataTable();
                        var dt = new DataTable("notas");
                        var da = new SqlDataAdapter(cmd);
                        da.Fill(dt);
                        Table = dt;

                        if (Table.Rows.Count != 0)
                        {
                            byte[] barrFile = (byte[])Table.Rows(0)(0);
                            using (FileStream newFile = new FileStream(("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf"), FileMode.Create, FileAccess.Write))
                            {
                                newFile.Write(barrFile, 0, barrFile.Length);
                                newFile.Flush();
                                newFile.Close();
                            }
                        }
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show("Error al leer la Base de Datos" + error.Message, "Usuarios", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }


    lunes, 29 de enero de 2018 7:58

Respuestas

  • TE marco el error en negrita y los cambios en negrita italico.

      public static void GetRichTextBox(int id)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                    {
                        var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);
    
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        con.Open();
    
                        DataTable dt= new DataTable();
                        var dt = new DataTable("notas"); <- COMENTALO O BORRALO 
                        var da = new SqlDataAdapter(cmd);
                        da.Fill(dt); 
                       Table = dt;  <- COMENTALO O BORRALO USA dt DIRECTAMENTE
    
                        if (Table.Rows.Count != 0) //cambia TABLE por dt
                        {
                            byte[] barrFile = (byte[])TABLE.Rows(0)(0);  //cambia TABLE por dt
                            using (FileStream newFile = new FileStream(("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf"), FileMode.Create, FileAccess.Write))
                            {
                                newFile.Write(barrFile, 0, barrFile.Length);
                                newFile.Flush();
                                newFile.Close();
                            }
                        }
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show("Error al leer la Base de Datos" + error.Message, "Usuarios", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }

    También mencionarte que no puedes usar el Objeto Table directamente pues es un tipo y no es estático.



    lunes, 29 de enero de 2018 8:11
  • Algo estas haciendo mal. En el primer codigo ponias Table.Rows, y eso estaba bien porque el Table efectivamente tiene una propiedad que se llama Rows (aunque lo llamabas mal porque pusiste parentesis redondos en lugar de cuadrados). Pero en tu ultimo ejemplo has cambiado el DataTable por un DataReader. Y el DataReader NO tiene una propiedad que se llame Rows, luego no vale nada de lo que estas haciendo. Una de dos, o bien dejas el DataTable como estaba al principio,y entonces puedes usar Rows (poniendo bien los parentesis), o bien cambias a un DataReader, pero entonces hay que cambiar tambien TODO el resto del codigo porque ya no existe el Rows.
    lunes, 29 de enero de 2018 13:54
    Moderador
  • Te pongo solo la parte del using, todo lo demas queda igual.

    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                     {
                         var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);
    
                         cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
    
                         con.Open();
    
                         SqlDataReader dr = cmd.ExecuteReader();
    
                         if (dr.Read())
                         {
                             byte[] barrFile = (byte[])dr[0];
                             File.WriteAllBytes("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf", barrFile);
                         }
                         dr.Close();
                     }

    Lo he simplificado un poco, cambiando el while por un if (si hubiera varios refistros devueltos por el datareader, el while iria machacando el mismo archivo una vez tras otra, cosa que no serviria para nada, asi que tenemos que presumir que el id es unico, o de lo contrario el codigo no es fiable).

    Tambien te he cambiado la escritura del archivo por un mecanismo mucho mas simple que el que tenias.

    • Marcado como respuesta Rudolf Heiner miércoles, 31 de enero de 2018 11:44
    lunes, 29 de enero de 2018 17:27
    Moderador

Todas las respuestas

  • TE marco el error en negrita y los cambios en negrita italico.

      public static void GetRichTextBox(int id)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                    {
                        var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);
    
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        con.Open();
    
                        DataTable dt= new DataTable();
                        var dt = new DataTable("notas"); <- COMENTALO O BORRALO 
                        var da = new SqlDataAdapter(cmd);
                        da.Fill(dt); 
                       Table = dt;  <- COMENTALO O BORRALO USA dt DIRECTAMENTE
    
                        if (Table.Rows.Count != 0) //cambia TABLE por dt
                        {
                            byte[] barrFile = (byte[])TABLE.Rows(0)(0);  //cambia TABLE por dt
                            using (FileStream newFile = new FileStream(("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf"), FileMode.Create, FileAccess.Write))
                            {
                                newFile.Write(barrFile, 0, barrFile.Length);
                                newFile.Flush();
                                newFile.Close();
                            }
                        }
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show("Error al leer la Base de Datos" + error.Message, "Usuarios", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }

    También mencionarte que no puedes usar el Objeto Table directamente pues es un tipo y no es estático.



    lunes, 29 de enero de 2018 8:11
  • saludos vyrcyrus ya lo arregle em metodo pero me vota error todavia en rows y me he dado cuenta que no existe en las propiedades: 

            public static void GetRichTextBox(int id)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                    {
                        var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);

                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;

                        con.Open();

                        SqlDataReader dr = cmd.ExecuteReader();

                        while (dr.Read())
                        {
                            byte[] barrFile = (byte[])dr.Rows(0)(0);
                            using (FileStream newFile = new FileStream(("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf"), FileMode.Create, FileAccess.Write))
                            {
                                newFile.Write(barrFile, 0, barrFile.Length);
                                newFile.Flush();
                                newFile.Close();
                            }
                        }
                        dr.Close();
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show("Error al leer la Base de Datos" + error.Message, "Ventas / Notas / GetRichTextBox", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }


    lunes, 29 de enero de 2018 10:15
  • El error sigue y es:

    'System.Data.SqlClient.SqlDataReader' no contiene una definición de 'Rows' ni se encontró ningún método de extensión 'Rows' que acepte un primer argumento de tipo 'System.Data.SqlClient.SqlDataReader' (¿falta una directiva de uso o una referencia de ensamblado?)
    lunes, 29 de enero de 2018 13:39
  • Algo estas haciendo mal. En el primer codigo ponias Table.Rows, y eso estaba bien porque el Table efectivamente tiene una propiedad que se llama Rows (aunque lo llamabas mal porque pusiste parentesis redondos en lugar de cuadrados). Pero en tu ultimo ejemplo has cambiado el DataTable por un DataReader. Y el DataReader NO tiene una propiedad que se llame Rows, luego no vale nada de lo que estas haciendo. Una de dos, o bien dejas el DataTable como estaba al principio,y entonces puedes usar Rows (poniendo bien los parentesis), o bien cambias a un DataReader, pero entonces hay que cambiar tambien TODO el resto del codigo porque ya no existe el Rows.
    lunes, 29 de enero de 2018 13:54
    Moderador
  • Gracias por responder Alberto, me podras ayudar con el ultimo codigo que mande con el DataReader por favor, quedo de ti y gracias.
    lunes, 29 de enero de 2018 14:18
  • Te pongo solo la parte del using, todo lo demas queda igual.

    using (SqlConnection con = new SqlConnection(conexion.CadenaConexion()))
                     {
                         var cmd = new SqlCommand("SELECT nota FROM notas WHERE id = @id", con);
    
                         cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
    
                         con.Open();
    
                         SqlDataReader dr = cmd.ExecuteReader();
    
                         if (dr.Read())
                         {
                             byte[] barrFile = (byte[])dr[0];
                             File.WriteAllBytes("C:\\Temp\\RTF\\Temporal'" + id + "'.rtf", barrFile);
                         }
                         dr.Close();
                     }

    Lo he simplificado un poco, cambiando el while por un if (si hubiera varios refistros devueltos por el datareader, el while iria machacando el mismo archivo una vez tras otra, cosa que no serviria para nada, asi que tenemos que presumir que el id es unico, o de lo contrario el codigo no es fiable).

    Tambien te he cambiado la escritura del archivo por un mecanismo mucho mas simple que el que tenias.

    • Marcado como respuesta Rudolf Heiner miércoles, 31 de enero de 2018 11:44
    lunes, 29 de enero de 2018 17:27
    Moderador