Datatable tipada y Linq

17/09/2007 - 15:21 por Beto | Informe spam
Yo quisiera hacer una clase nombrada RegistroVariable que mandandole a su
constructor un nombre de tabla y una clave primaria INT (identity) de una
tabla de mi base de datos me retorne un objeto (que podria ser un datatable
tipado) que me incluya en sus propiedades los nombres de los campos de esa
tabla y en sus valores los valores de dichos campos.

Ejemplo:

RegistroVariable Reg=New RegistroVariable("Tabla1",14567); /*1457 es la
clave primaria de la tabla Tabla1*/

Ejemplo: La estructura de Tabla1 es PK (int), TrFec (datetime), TrNo (int),
TrDet (char(40)

Yo quiero que me retorne en Reg esos mismos campos de manera que pueda
acceder a ellos
de la forma Reg.PK, Reg.TrFec, Reg.TrNo, Reg. TrDet.


Ok yo podria definir el tipo RegistroVariable con esa estructura de fields
pero el punto es que quiero usar la misma clase RegistroVariable para
diferentes tablas que tienen diferentes estructuras, lo unico comun es la PK
que es INT pero son muchas tablas con distintos nombres de campos y tipos en
sql server.. No se si me explicado bien.

Si se puede, como puedo generalizarlo para una sola clase?


Por cierto alguien me dijo que con Linq en la proxima version eso se hace
mas sencillo ? Es cierto? me podrian decir como ?

Conocen algun foro de Linq?

muchas grcs.
beto

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
17/09/2007 - 22:45 | Informe spam
"Beto" wrote in message
news:ungXa2S%
Mostrar la cita
Es problemático. Para que puedas hacer Reg.LoQueSea, el compilador tiene
que conocer ese "LoQueSea", pero si se define en tiempo de ejecución en
función del string "Tabla1", no se conoce en tiempo de compilación.

Lo más parecido sería Reg("PK"), Reg("TrFec"), etc., pero esto sería
simplemente un DataRow de un DataTable no tipado, el cuál podrías llenar de
forma bastante simple con un Fill de un DataAdapter.


Mostrar la cita
No es solo Linq, sino también el C# versión 3. En esta versión puedes
declarar tu variable Reg como var Reg=Expresion;, y luego usar Reg.LoQueSea,
pero para eso todos los campos tienen que ser conocidos dentro de Expresion,
no puede ser un string que se resuelva sobre la marcha. Pero lo que sí
tienes es que Visual Studio 2008 the permite definir de forma gráfica un
origen de datos que abarque todas las tablas que quieras de la base de
datos, y luego puedes hacer Select en tu código desde el origen de datos, y
te reconoce las columnas como quieres (pero la tabla la tienes que poner
fija, no puede ser un string).
#2 Beto
18/09/2007 - 13:14 | Informe spam
Mostrar la cita
Ok, me bastaría con eso: Reg["PK"] o Reg["TrFec"] ya que no podría usar
directamente Reg.PK y Reg.TrFec (la verdad no entiendo por qué si para los
fines es lo mismo).
Pero pregunto, que problemas da ?, no se si de rendimiento o de tipos yo
usar ese forma Reg["NombreCampo"] dondequiera que yo desee acceder ese valor
o modificarlo en vez de tener que definir una clase tipada para cada tipo de
registro distinto? No se recomienda? Hay que hacer unbox o casting de tipos
para usar cada valor de las columnas de Reg?

Mostrar la cita
Bien pero lo que hace es generar el codigo por mi no ? es decir crear un
dataset tipado y los datatables tipados , no es asi? Si lo es pues es igual
y lo quería evitar.

Finalmente cuando digo que el nombre de tabla se manda como string es con la
idea de armar un select en un string.
Algo parecido a: "select * from "+cNombreTabla+" where
PK="+nValorPK.ToString().Trim()



Muchas gracias por la ayuda tocayo :)

Beto

Beto
#3 Alberto Poblacion
18/09/2007 - 14:26 | Informe spam
"Beto" wrote in message
news:OA0zLUe%
Mostrar la cita
No, para los fines NO es lo mismo. En el caso de Reg["PK"], si pones
cualquier cosa entre las comillas el programa compila sin errores, pero
"casca" al ejecutarlo. En el caso de Reg.PK, el intellisense te ofrece los
valores disponibles, y el compilador te da un error si pones un valor
incorrecto.

Mostrar la cita
No, problemas de rendimiento no es probable que tenga. La pequeñísima
cantidad de tiempo que pierdan las rutinas en buscar el campo por su nombre
es insignificante en comparación con el coste que tiene recuperar
previamente el registro desde la base de datos. El principal motivo por el
que se recomienda no usar esta construcción es precisamente el de que los
errores solo se detectan en tiempo de ejecución, no en tiempo de
compilación.

Mostrar la cita
Sí, si usas esta construcción hay que hacer un cast del Reg[campo] al
tipo de la variable a la que lo asignas, y esto es otra operación más que
puede fallar en tiempo de ejecución sin que te lo detecte antes el
compilador.

Mostrar la cita
No, el Linq no funciona asi. El código de selección de datos lo tienes
que escribir tú, y lo que ocurre es que el compilador produce directamente
clases que encapsulan los resultados de la consulta. No hay datasets ni
datatables por ningún lado.

Mostrar la cita
Sí, si. Eso se lo puedes meter al CommandText del SelectCommand de un
DataAdapter, con él haces un Fill de un DataTable, y devuelves el Rows[0] de
ese DataTable. Sobre ese DataRow devuelto (llamémosle Reg) ya puedes
preguntar por el Reg["TrFec"] y demás columnas, como querías.
#4 Beto
18/09/2007 - 14:39 | Informe spam
Respuesta de lujo! Ya entendí bien.

De nuevo, muchas gracias.

Beto


"Alberto Poblacion"
escribió en el mensaje news:uFuY68e%
Mostrar la cita
#5 Rafael
22/09/2007 - 14:45 | Informe spam
Mostrar la cita
No se si es confusion pero yo baje la version beta del 2008 y veo que al
agregar una tabla a mis datasources en un form, ciertamente como dice Beto
automaticamente me genera todo el codigo que me genera VS2005, es decir
datasets, datatables, datacolumns, etc.

Se hacen consultas por Linq a una base de datos directamente sin tener que
agregar las tablas a los datasources?


Rafael
Ads by Google
Search Busqueda sugerida