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

Datos desconectados

Estas en el tema de Datos desconectados en el foro de .NET en Foros del Web. Hola, he empezado a trabajar con datos desconectados. Tengo una base de datos en Access con tres tablas relacionadas: Estudiantes( exp_est , nom_est) con Est_Asig( ...
  #1 (permalink)  
Antiguo 09/06/2004, 15:00
 
Fecha de Ingreso: abril-2002
Mensajes: 14
Antigüedad: 22 años
Puntos: 0
Pregunta Datos desconectados

Hola,
he empezado a trabajar con datos desconectados. Tengo una base de datos en Access con tres tablas relacionadas: Estudiantes(exp_est, nom_est) con Est_Asig(exp_est, num_asig) y Asignaturas(num_asig, nom_asig) con Est_asig. Es decir, tengo una relación M:N entre estudiantes y asignaturas y los campos subrayados con claves primarias. En mi código de la página ASP .NET he almacenado en un dataset (objAlmacen) las tres tablas incluidas las relaciones. El problema surge cuando actualizo un registro de la tabla Estudiantes. Me da el siguiente error:
Falta DataColumn 'NUM_ASIG' en DataTable 'Estudiantes' para SourceColumn 'NUM_ASIG'.
Tras esto he forzado a actualizar en cascada pero no resuelvo nada. Lo que no entiendo es pq me pide que añada a la tabla ese nuevo campo. Os paso el código a ver si me puede ayudar alguien:
'Genero la conexión
strConexion = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("BaseDatos\colegio.mdb") & ";"
objConexion = New OleDbConnection(strConexion)
strsql = "SELECT * FROM ESTUDIANTES"
'Construyo el comando
objcomando = New OleDbCommand(strsql, objConexion)
'Construyo el adaptador
objAdaptador = New OleDbDataAdapter(objcomando)
objConstructor = New OleDbCommandBuilder(objAdaptador)
objAdaptador = objConstructor.DataAdapter
'Abro la conexion
objConexion.Open()
objAlmacen = New DataSet
'Añado la primera tabla
objAdaptador.Fill(objAlmacen, "Estudiantes")
'Modifico el comando para la siguiente Select
objcomando.CommandText = "SELECT * FROM ASIGNATURAS"
'Añado la segunda tabla
objAdaptador.Fill(objAlmacen, "Asignaturas")
'Modifico el comando para la siguiente Select
objcomando.CommandText = "SELECT * FROM EST_ASIG"
'Añado la tercera tabla
objAdaptador.Fill(objAlmacen, "Estudiantes_Asignaturas")
'cierro la conexión
objConexion.Close()
'Creo las relaciones entre las tablas. Siempre de padre a hijo (1:N). Necesita dos objetos DataColumn
est_asig = New DataRelation("relEstAsig", objAlmacen.Tables("Estudiantes").Columns("exp_est" ), objAlmacen.Tables("Estudiantes_Asignaturas").Colum ns("exp_est"))
asig_est = New DataRelation("relAsigEst", objAlmacen.Tables("Asignaturas").Columns("num_asig "), objAlmacen.Tables("Estudiantes_Asignaturas").Colum ns("num_asig"))

'Añado estos objetos al DataSet

objAlmacen.Relations.Add(est_asig)
objAlmacen.Relations.Add(asig_est)
Dim objRestriccion As ForeignKeyConstraint
objRestriccion = objAlmacen.Tables("Estudiantes_Asignaturas").Const raints("relEstAsig")
objRestriccion.DeleteRule = Rule.Cascade
objRestriccion.UpdateRule = Rule.Cascade

objRestriccion = objAlmacen.Tables("Estudiantes_Asignaturas").Const raints("relAsigEst")
objRestriccion.DeleteRule = Rule.Cascade
objRestriccion.UpdateRule = Rule.Cascade
objAlmacen.EnforceConstraints = True
'Actualizo una determinada fila
objAlmacen.Tables("estudiantes").Rows(0).Item("exp _est") = 1111
Dim Modificadas As DataSet = objAlmacen.GetChanges(DataRowState.Modified)
If Not Modificadas.Tables("estudiantes") Is Nothing Then
objAdaptador.Update(Modificadas, "estudiantes")'Aquí me peta
End If
...
objAlmacen.AcceptChanges()

Gracias de antemano.
  #2 (permalink)  
Antiguo 10/06/2004, 02:00
Avatar de GeRuNdIo  
Fecha de Ingreso: marzo-2004
Ubicación: Sanlúcar de Barrameda, Cádiz
Mensajes: 232
Antigüedad: 20 años, 1 mes
Puntos: 2
Hola,
No sé si será este el problema, pero creo que lo que pasa es que no existe una relación directa entre Estudiantes y Asignaturas, y por tanto te muestra el mensaje que nos dices.
La solución al problema, según mi criterio, es reorganizar las tablas, creo que el objetivo que pretendes lo puedes realizar tan solo con dos de esas tablas: Estudiantes y Asignaturas.
El código que nos muestras está correcto (si no se me escapa nada...) así que el problema lo veo donde te estoy diciendo. Prueba a usar solo dos tablas y la relación que une esas dos tablas.
Suerte!
__________________
Una buena forma de sacar las castañas del fuego sin quemarse: LEE FOROSDELWEB..... :si:
------
F.P.R. MCAD .NET
  #3 (permalink)  
Antiguo 10/06/2004, 03:48
 
Fecha de Ingreso: abril-2002
Mensajes: 14
Antigüedad: 22 años
Puntos: 0
Esto no va...

Hola otra vez,

lo he intentado. He creado dos tablas: estudiantes a la que le he añadido la columna nom_asig de la tabla asignaturas y asignaturas a la que le he añadido el campo exp_est y no me deja. Da el siguiente error:
La generación SQL dinámica no es compatible con varias tablas de base.

Y tiene razón pq en la bd original no existe una tabla estudiantes similar. De todas formas si lo hacía de esta forma no tiene sentido el concepto de relación y además tendría información repetida.

¿Qué puedo hacer? He hecho la prueba de mostrar la información de un estudiante con sus respectivas asignaturas, es decir de la tabla padre estudiantes a la hija estudiantes_asignaturas y de esta a su padre, asignaturas y todo ha ido bien...
  #4 (permalink)  
Antiguo 10/06/2004, 04:15
Avatar de GeRuNdIo  
Fecha de Ingreso: marzo-2004
Ubicación: Sanlúcar de Barrameda, Cádiz
Mensajes: 232
Antigüedad: 20 años, 1 mes
Puntos: 2
mmmmmm....
Creo que el problemas lo tienes a mas bajo nivel, en la base de datos. Reestructura esas tablas "en la base de datos", (normalizandolas claro).
Si no funciona eso....lo siento pero no te puedo ayudar, se me escapa de mis escasos conocimientos.
Mucha Suerte chica!
__________________
Una buena forma de sacar las castañas del fuego sin quemarse: LEE FOROSDELWEB..... :si:
------
F.P.R. MCAD .NET
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 00:02.