Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: ikkaku en 23 Enero 2015, 10:43 am



Título: Error al acceder a base de datos - C#
Publicado por: ikkaku en 23 Enero 2015, 10:43 am
Hola a todos.
He puesto la misma duda en el foro de Base de Datos pero ahora dudo si deberia estar ahi o aqui.
Os comento, estoy programando una aplicacion HMI para el control de un automata y a la hora de acceder a la base de datos el programa se me para y me salta el siguiente error.

Citar
Se produjo una excepción de tipo 'System.NotSupportedException' en EntityFramework.dll
pero no se controló en el código del usuario

Información adicional:
Citar
Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). For ASP.NET WebForms you can bind to the result of calling ToList() on the query or use Model Binding, for more information see"

El codigo es el siguiente:
Código
  1. private MainWindow mainWindow;
  2. private basedatosEntities bbdd;
  3. private element producto;
  4.  
  5. public PageSeleccion()
  6. {
  7. InitializeComponent();
  8. bbdd = DataBaseFactory.GetbasedatosDatabaseEntities();
  9. this.productoList.ItemsSource = bbdd.element; <----- Aqui me salta el error
  10. this.producto = null;
  11. }



basedatos es mi base de datos y element es una tabla de la base.

Me gustaria que me ayudarais a resolver este problema.

Gracias.



[MOD]: Usa las etiquetas adecuadas para insertar código o citas.


Título: Re: Error al acceder a base de datos - C#
Publicado por: ikkaku en 24 Enero 2015, 12:05 pm
Perdoname, pensaba que las habia puesto pero me equivoque. Tal y como esta ahora es correcto no ?

Edit: El proyecto usa una version de .NET Framework de destino 4.5.1 no se si estara relacionado con el problema


Título: Re: Error al acceder a base de datos - C#
Publicado por: Eleкtro en 24 Enero 2015, 13:34 pm
Hola

No tiene nada que ver con la versión objetivo de .Net Framework, en la información que has mostrado, el error se explica por si mismo, y también la solución :P

No puedes enlazar los datos de la query directamente, así que debes generar una colección local.

Prueba una de estas simples modificaciones dependiendo de la tecnología que estés usando (WinForms / WPF / ASP.Net, como se especifica en el error de arriba):
Código
  1. this.productoList.ItemsSource = bbdd.element.ToList;
Código
  1. this.productoList.ItemsSource = bbdd.element.ToBindingList;

o tal vez:
Código
  1. this.productoList.ItemsSource = (from item in bbdd select).ToList();

Saludos


Título: Re: Error al acceder a base de datos - C#
Publicado por: ikkaku en 26 Enero 2015, 08:47 am
Pero en cambio en otro programa similar que tengo con las mismas lineas de codigo no me salta ningun error y hace lo que deberia hacer.

Código
  1. database = DataBaseFactory.GetlantaDatabaseEntities();
  2. this.productoList.ItemsSource = database.producto;
  3.  


Código
  1.  private void ButtonNewProductClick(object sender, System.Windows.RoutedEventArgs e)
  2.        {
  3.  
  4.  
  5.            ObjectSet<producto> listProd = (ObjectSet<producto>) this.productoList.ItemsSource;
  6.            producto prod = listProd.CreateObject();
  7.            prod.imagen = null;
  8.            prod.mosaico = null;
  9.            prod.id_producto = -1;
  10.  
  11.            if (selectedProduct != null)
  12.            {
  13.                prod.alto = selectedProduct.alto;
  14.                prod.ancho = selectedProduct.ancho;
  15.                prod.largo = selectedProduct.largo;
  16.            }
  17.            else
  18.            {
  19.                prod.alto = Systema.MIN_L;
  20.                prod.ancho = Systema.MIN_L;
  21.                prod.largo = Systema.MIN_L;
  22.            }
  23.  
  24.            //obtengo un nombre unico
  25.            String nombre = "PRODUCTO";
  26.            int i=0;
  27.            foreach (producto p in listProd)
  28.            {
  29.                try
  30.                {
  31.                    int aux = int.Parse(p.nombre.Substring(8));
  32.                    if (i <= aux)
  33.                    {
  34.                        i = aux + 1;
  35.                    }
  36.                }
  37.                catch (Exception)
  38.                { }
  39.  
  40.                if (String.CompareOrdinal(p.nombre.ToUpper(), (nombre + i)) == 0)
  41.                {
  42.                    i++;
  43.                }
  44.            }
  45.  
  46.  
  47.            prod.nombre = nombre + i;
  48.            listProd.AddObject(prod);            
  49.            database.SaveChanges();
  50.  
  51.            database = DataBaseFactory.GetUpdatedlantaDatabaseEntities();
  52.            this.productoList.ItemsSource = database.producto;
  53.  
  54.  
  55.  
  56.            selectedProduct = prod;            
  57.            this.mosaicoList.ItemsSource = selectedProduct.mosaico;
  58.            this.selectedMosaico = null;
  59.  
  60.            this.productoNombre.Text = selectedProduct.nombre;
  61.            this.alto.Text = selectedProduct.alto.ToString();
  62.            this.ancho.Text = selectedProduct.ancho.ToString();
  63.            this.largo.Text = selectedProduct.largo.ToString();
  64.  
  65.            this.sliderAlto.Value = selectedProduct.alto;
  66.            this.sliderAncho.Value = selectedProduct.ancho;
  67.            this.sliderLargo.Value = selectedProduct.largo;

Ese codigo es para crear nuevos elementos en la base de datos y que aparezcan en un DataGrid y es lo que quiero hacer en el nuevo codigo.

Esta es la parte de crear un nuevo producto del nuevo codido:

Código
  1.        private void ButtonNewProductClick(object sender, RoutedEventArgs e)
  2.        {
  3.            ObjectSet<element> listProd = (ObjectSet<element>) this.productoList.ItemsSource;
  4.        }
  5.  

En esa linea si pongo el acceso a la coleccion como .ToList() me dice lo siguiente:

Citar
Información adicional: No se puede convertir un objeto de tipo 'System.Collections.Generic.List`1[HMI_2.element]' al tipo 'System.Data.Objects.ObjectSet`1[HMI_2.element]'

Edit: Acabo de ver que el primer codigo ,el que funciona, tiene esta linea en el .XAML dentro de Page.Resources no se si tendra que ver:
Código
  1. <CollectionViewSource x:Key="productoViewSource" d:DesignSource="{d:DesignInstance my:producto, CreateList=True}" />


Título: Re: Error al acceder a base de datos - C#
Publicado por: ikkaku en 30 Enero 2015, 16:06 pm
Una ayudita ??  :( :(