Cómo actualizar las tablas de Padres e Hijos del conjunto de datos generados automáticamente con Identidad clave?

StackOverflow https://stackoverflow.com/questions/931630

  •  06-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando conjuntos de datos ADO.NET en mis aplicaciones VB. Tengo un conjunto de datos con tipo con mesa de uno de los padres, y muchas tablas secundarias. Quiero generar Identidad clave al insertar datos en la tabla de Padres y luego actualizar los datos en todas las tablas secundarias con la misma clave (como la clave Foregin).

Por último, quiero actualizar el conjunto de datos en la base de datos (SQL Server08).

Bueno, lo anterior puede ser posible mediante la inserción de la primera tabla primaria en la base de datos directamente, obtener la columna de identidad y que el uso de las tablas para niños.

Pero quiero esto como una operación automática (como LINQ a SQL que se encarga de Primaria y claves foráneas para DataContext.)

I tal cosa sea posible del conjunto de datos que se encarga de la columna generados automáticamente para tablas primarias y secundarias?

Gracias,

ABB

No hay solución correcta

Otros consejos

Creo que esto debería ser más evidente y debería funcionar sin ningún ajuste. Pero aún así, es bastante fácil.

La solución tiene dos partes:

  1. Crea DataRelation entre tablas padre y y la puso en cascada sobre las actualizaciones. De esta manera cada vez que cambia el ID de los padres, se actualizarán todos los niños.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. comandos de inserción de conjunto de datos y la actualización son de dos vías: Si hay algún parámetros de salida con destino o cualquier filas de datos devueltos, se van a utilizar para actualizar la fila de datos que causó la actualización.

    Esto es muy útil para este problema concreto: conseguir columnas autogenerados una copia de la aplicación. Aparte de identidad que esto podría ser por ejemplo una columna de marca de tiempo. Pero la identidad es más útil.

    Todo lo que tenemos que hacer es configurar comandos de inserción para volver identidad. Hay varias maneras de hacerlo, por ejemplo:

    a) El uso de procedimiento almacenado con parámetro de salida. Esta es la forma más portátil entre las bases de datos "reales".

    b) El uso de varias sentencias SQL, con último volviendo fila insertada. Se trata de que yo sepa específica a SQL Server, pero la más sencilla:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

Después de configurar esto, todo lo que necesita hacer es crear filas primarias con Ids que son únicas (dentro de un solo conjunto de datos), pero imposible en la base de datos. Los números negativos suelen ser una buena opción. Entonces, al guardar los cambios a la base de datos del conjunto de datos, todas las nuevas filas primarias tendrán Ids reales de la base de datos.


Nota: Si va a trabajar con la base de datos sin múltiples soportes indicados y sin procedimientos almacenados (por ejemplo Access), que tendrá que controlador de eventos de configuración en caso de RowUpdated adaptador de tabla primaria. En el hanler que necesita para obtener la identidad con el comando select @@IDENTITY.


Algunos enlaces:

Un par de cosas a destacar.

  1. Sí, definitivamente necesitas las relaciones asignadas para ambas tablas. Se puede comprobar a partir editor de xsd (haga doble clic en el archivo xsd). Por defecto, la relación se establece como 'relación única' que no tiene ninguna 'regla de actualización'. Editar esta relación por entrar en 'editar relación' y seleccione 'restricción de clave externa Sólo' o 'Tanto ~~~' uno. Y la necesidad de establecer 'regla de actualización' como cascada! 'Eliminar regla' depende de usted.

  2. Ahora cuando se utiliza Identificación de un nuevo de fila de la tabla padre (AutoIncrement) para las nuevas filas de la tabla hijo como una clave externa, hay que añadir la fila padre en la tabla primero antes de utilizar ID de la nueva fila padre alrededor.

  3. Tan pronto como usted la llama de actualización para la tabla primaria usando tableadapter, los nuevos registros de la tabla secundaria asociada tendrán parentID correcta automáticamente.

Mis simples fragmentos de código:

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

Espero que ayude!

Y si no desea utilizar conjuntos de datos y obtener los identificadores asignados al niño y conseguir los identificadores sin embargo, para que pueda actualizar su modelo: https://danielwertheim.wordpress.com/2010/10/ 24 / C-batch-identity-inserciones /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top