Foros del Web » Programación para mayores de 30 ;) » .NET »

no se puede convertir implicitamente int en dataset.datatable

Estas en el tema de no se puede convertir implicitamente int en dataset.datatable en el foro de .NET en Foros del Web. Estoy haciendo un boton que lea los archivos de una serie de carpetas y luego guarde la informacion de estos en una tabla. Tengo una ...
  #1 (permalink)  
Antiguo 29/06/2013, 11:30
 
Fecha de Ingreso: abril-2012
Mensajes: 17
Antigüedad: 12 años
Puntos: 0
no se puede convertir implicitamente int en dataset.datatable

Estoy haciendo un boton que lea los archivos de una serie de carpetas y luego guarde la informacion de estos en una tabla.
Tengo una tabla videos donde se almacenan estos datos, la cual tiene un query "insert" en el tableAdapter.

Este es mi boton:
Código:
private void actualizar_Click(object sender, EventArgs e)
        {
            Program.listFiles();
        }
Este es mi codigo en program.cs:
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using System.IO;
using System.Data;


namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Punto de entrada principal para la aplicación.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        public static void listFiles()
        {
            try
            {
                DirectoryInfo directory = new DirectoryInfo(@"D:\Jueg");
                FileInfo[] files = directory.GetFiles("*.*");
                 for (int i = 0; i < files.Length; i++)
                {
                    string nombre = ((FileInfo)files[i]).FullName;
                    string direccion = ((FileInfo)files[i]).DirectoryName;
                    string fecha = ((FileInfo)files[i]).CreationTime.ToString();
                    
                    canal4videosDataSetTableAdapters.videoTableAdapter videoTableAdapter1;
                    videoTableAdapter1 = new canal4videosDataSetTableAdapters.videoTableAdapter();

                    canal4videosDataSet.videoDataTable newvideoTable;
                    newvideoTable = videoTableAdapter1.insertvideos(nombre, fecha, direccion);
                }                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
En el texto marcado en rojo me tira este error:

Error 1 No se puede convertir implícitamente el tipo 'int' en 'WindowsFormsApplication1.canal4videosDataSet.vide oDataTable' C:\Documents and Settings\Ale\mis documentos\visual studio 2010\Projects\explorador\explorador\Program.cs 44 37 explorador

Exactamente cual es el problema? alguien podria ayudarme?
  #2 (permalink)  
Antiguo 29/06/2013, 12:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: no se puede convertir implicitamente int en dataset.datatable

Pues, en realidad no es muy complicado: Si newvideoTable es un DateTable, y videoTableAdapter1.insertvideos una función que devuelve un entero, no puedes asignar un entero a un objeto DataTable...
¿No te parece?
En todo caso deberías asignar un entero a un campo Int, de un DataRow, que pertenece a un DataTable.
En cualquier caso, no has posteado la estructura de la función videoTableAdapter1.insertvideos(), por lo que en realidad no sabemos qué hace.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/06/2013, 12:55
 
Fecha de Ingreso: abril-2012
Mensajes: 17
Antigüedad: 12 años
Puntos: 0
Respuesta: no se puede convertir implicitamente int en dataset.datatable

INSERT INTO [video] ([Vnombre], [Vfecha], [Vdireccion]) VALUES (@p1, @p2, @p3)

p1, p2 y p3 son strings y en realidad no devuelve nada, simplemente agrega los datos a la tabla y ya.
Lo hice en el diseñador del dataset.

Tampoco es que sepa como ejecutar los querys de un tableadapter de todos modos, ese codigo fue el unico que encontre.
  #4 (permalink)  
Antiguo 29/06/2013, 13:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: no se puede convertir implicitamente int en dataset.datatable

Código SQL:
Ver original
  1. INSERT INTO [video] ([Vnombre], [Vfecha], [Vdireccion]) VALUES (@p1, @p2, @p3)
Esto es SQL, no C#. Son cosas completamente diferentes (SQL ni siquiera es un lenguaje de programación, es de consultas).
Por un lado, si estás insertando algo en la base de datos, no va a devolver un DataTable de ninguna forma. En todo caso debería devolver un valor que represente que la ejecución fue exitosa o no, y eso no es un DT.
Por otro lado, aún no muestras qué es lo que se supone que contiene sa función, sin lo cual no te podemos decir si está bien o mal.
Lo que sí podemos decirte es que para que esa linea te funcione , videoTableAdapter1.insertvideos(nombre, fecha, direccion) debería devolver un dataTableAdapter... cosa que no hace.
Postea el código de la función invocada y veamos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/06/2013, 14:06
 
Fecha de Ingreso: abril-2012
Mensajes: 17
Antigüedad: 12 años
Puntos: 0
Respuesta: no se puede convertir implicitamente int en dataset.datatable

Supongo que esta hablando de esto:

Código:
public virtual int insertvideos(string p1, string p2, string p3) {
            global::System.Data.SqlServerCe.SqlCeCommand command = this.CommandCollection[3];
            if ((p1 == null)) {
                throw new global::System.ArgumentNullException("p1");
            }
            else {
                command.Parameters[0].Value = ((string)(p1));
            }
            if ((p2 == null)) {
                throw new global::System.ArgumentNullException("p2");
            }
            else {
                command.Parameters[1].Value = ((string)(p2));
            }
            if ((p3 == null)) {
                throw new global::System.ArgumentNullException("p3");
            }
            else {
                command.Parameters[2].Value = ((string)(p3));
            }
            global::System.Data.ConnectionState previousConnectionState = command.Connection.State;
            if (((command.Connection.State & global::System.Data.ConnectionState.Open) 
                        != global::System.Data.ConnectionState.Open)) {
                command.Connection.Open();
            }
            int returnValue;
            try {
                returnValue = command.ExecuteNonQuery();
            }
            finally {
                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
                    command.Connection.Close();
                }
            }
            return returnValue;
        }
Estaba en el dataset.designer.cs, se que no es lo mismo SQL que C# pero crei que eso me estaba preguntando.

Entonces como invocaria la funcion?

Última edición por SoVre; 29/06/2013 a las 15:21
  #6 (permalink)  
Antiguo 29/06/2013, 15:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: no se puede convertir implicitamente int en dataset.datatable

Fijate que tú mismo estás definiendo que la función devuelve un entero:
Código C#:
Ver original
  1. public virtual int insertvideos(string p1, string p2, string p3)
La variable de retorno, la defines:
Código C#:
Ver original
  1. int returnValue;
Y con esa variable entera, estás obteniendo esto:
Código C#:
Ver original
  1. returnValue = command.ExecuteNonQuery();
y luego haces
Código C#:
Ver original
  1. return returnValue;
Lo que no estás teniendo en cuenta es qué es lo que devuelve el método ExecuteNonQuery():
SqlCeCommand.ExecuteNonQuery (Método)
Cita:
Ejecuta una instrucción SQL en SqlCeConnection y devuelve el número de filas afectadas.
Es decir, no devuelve, como te decía, ningún DataTableAdapter.
Lo que debes hacer es replantear todo lo que hicieste en el otro código, o bien, crear una función que haga las dos cosas: Insertar y leer.
Es decir:
1) Creas una instancia de DataTableAdapter.
2) Inserta un registro.
2) Si el método devuelve un valor entero positivo, llenas el DataTableAdapter realizando una consulta a ese registro que acabas de insertar.
4) Si fracasó, dejas la instancia de DataTableAdapter como nula o vacía.
5) Devuelves el DAtaTableAdapter.

Otra posibilidad es que valides si la llamada a la función está devolviendo un valor mayor a cero, y simplemente mandes a leer en consecuencia.

En cualquier caso, estás planteando mal la lógica de la función listFiles(), ya que lo que estás haciendo no es mandar a leer registros, sino a escribirlos. Son cosas distintas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/06/2013, 19:27
 
Fecha de Ingreso: abril-2012
Mensajes: 17
Antigüedad: 12 años
Puntos: 0
Respuesta: no se puede convertir implicitamente int en dataset.datatable

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using System.IO;
using System.Data;


namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Punto de entrada principal para la aplicación.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        public static void listFiles()
        {
            try
            {
                DirectoryInfo directory = new DirectoryInfo(@"D:\Jueg");                
                DirectoryInfo[] directories = directory.GetDirectories();
                int N = 0;
                for (int j = 0; j < directories.Length; j++)
                {
                    string dir = ((DirectoryInfo)directories[j]).FullName;
                    DirectoryInfo dirc = new DirectoryInfo(@dir);    
                    FileInfo[] files = dirc.GetFiles("*.*");       
                    for (int i = 0; i < files.Length; i++)
                    {
                        string nombre = ((FileInfo)files[i]).Name;
                        string direccion = ((FileInfo)files[i]).DirectoryName;
                        string fecha = ((FileInfo)files[i]).CreationTime.ToString();

                        canal4videosDataSetTableAdapters.videoTableAdapter videoTA1;
                        videoTA1 = new canal4videosDataSetTableAdapters.videoTableAdapter();
                        videoTA1.insertvideos(nombre, fecha, direccion);

                        N++;
                    }
               }
               MessageBox.Show("Agregados" + N.ToString() + "videos."); 


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
Este es mi codigo actual, funciona perfectamente.
Noto que los datos que le agrego no se incluyen en el dataset, pero cuando vuelvo a cargar el programa aparecen a pesar de que el programa extrae la informacion de dicho dataset, sin usar el boton actualizar, es normal?

Tengo otra duda, como hago para que actualice un archivo que ya existe? que le cambie la informacion, digamos lee el mismo archivo pero en otra carpeta, como hago para que lo actualice en lugar de agregarle otro?
He intentado con "if exist not exist" pero el sql no me los reconoce, hay alguna forma de hacerlo?

Solo eso me faltaria :L

Etiquetas: int, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:17.