(1) Prólogo
Cuando el conjunto de datos contiene tablas primarias y secundarias (tablas de clave primaria/tablas de clave externa), a veces las restricciones de relación son demasiado estrictas:
Por ejemplo, reglas de integridad de bases de datos relacionales:
1. Integridad de la entidad. No se permite que la clave principal en la tabla de claves principales esté vacía.
2. Integridad referencial. El valor de la clave externa en la tabla de claves externas debe corresponder a la clave primaria en la tabla de claves primarias.
Ya sea vacío o un valor de clave principal en la tabla de clave principal.
3. Personaliza la integridad.
Si las restricciones de relación de varias tablas definidas en la tabla DataSet son demasiado estrictas, utilice el método Actualizar directamente.
Al enviar varias tablas en un conjunto de datos juntas, es posible que no se cumplan las reglas de integridad y que se produzca un error.
Motivo: por ejemplo, configure dos tablas: CompanyMain (tabla principal de la empresa) y CompanySon (subtabla de la empresa)
CompanyMain (tabla principal de la empresa) almacena principalmente la información básica de una empresa, CompanySon (subtabla de la empresa)
Almacena principalmente información sobre algunos clientes de esta empresa y (ID) en la tabla principal de la empresa y (BelongID) en la subtabla.
Establezca una asociación, es decir, una relación de clave primaria y externa; una empresa corresponde a varios clientes, es decir, una relación ID:BelongID = 1:n.
El ID de la tabla principal es un número generado automáticamente.
Entonces:
Al enviar juntos la nueva interfaz de la empresa, el sistema no cumplirá con las "reglas de integridad de la base de datos" para actualizar la base de datos.
Si actualiza primero la subtabla y luego la tabla principal, es posible que se informe un error. El motivo es que la información de la empresa en la tabla principal aún no se ha insertado.
Para la tabla en la base de datos, el número de empresa: ID no se genera y no habrá un BelongID correspondiente cuando se actualice la subtabla.
En este momento, si se establece la regla de integridad "La clave externa en la tabla de claves externas no es nula", se generará una excepción.
Esto es solo una posibilidad de error, hay más posibilidades de error y es más probable que ocurran tales errores en el diseño distribuido
(2). La solución
generalmente sigue las siguientes reglas, lo que evitará una gran cantidad de posibilidades de error
. Regla Antes de actualizar el conjunto de datos, realice el envío dividido por <tabla> y <atributo RowState de la tabla>
I. Realizar el envío dividido por <tabla> significa:
las tablas del conjunto de datos no se envían juntas, sino una a la vez. Tabla, enviar varias veces
II. Dividir el envío según el <atributo RowState de la tabla> significa:
dividir una sola tabla en el conjunto de datos según el atributo RowState,
enviar el mismo RowState una vez y enviar varias veces
2. Reglas
basadas en. 1, primero actualice el estado de <nuevo> y <modificado>, y luego actualice el <eliminado>.
Es decir: primero actualice el valor de DataRowState: Agregado y Modificado, y luego actualice:
Eliminado
. 2, si se agrega y modifica DataRowState, primero se actualiza la tabla principal y luego se actualiza la subtabla. Según la regla
1 y la regla 2, si se elimina DataRowState, primero se actualiza la subtabla y luego la tabla secundaria
.La subtabla se actualiza. Actualice la tabla principal.
(3) Resuma las tres reglas anteriores de la siguiente manera:
1. Divida la tabla en el conjunto de datos, agrupe cada registro de la tabla según RowState y guárdelo en diferentes conjuntos de datos
// Esto debería ser. almacenado en el DataSet, esto se debe a que: La actualización acepta los parámetros del DataSet y WebService solo admite
//DataSet.Ejemplo de código
para la operación de serialización
:Supongamos que el conjunto de datos que se actualizará es: dsCompany (que incluye dos tablas, la tabla principal)
.y la subtabla) tabla, y almacena
datos, para ser actualizados)
//dtCompanyMain almacena información de la tabla principal de la empresa, dtCompanySon almacena información de la subtabla de la empresa
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone() //Separa los datos de la tabla principal
y almacena otro objeto
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //Separa los datos de la subtabla
y almacena otro objeto
DataSet dsAdded = new DataSet() //Almacena los datos recién agregados de la tabla principal
DataSet dsMidified = new DataSet(); Almacenar el registro de fila editado de la tabla principal
DataSet dsDeleted = new DataSet(); //Almacenar el registro de fila eliminado de la tabla principal
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); //Obtener el nuevo
registro de fila establecido
en la tabla principaldsMidified = dtCompanyMain.GetChanges (DataRowState.Modified); //Obtener el conjunto de registros de filas
editado
en la tabla principal dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //Obtenerel conjunto de registros de filas
eliminado en la tabla principal
2. Actualizar el estado de DataRowState; de la tabla principal a: Registros agregados y modificados
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //Actualiza el conjunto de registros agregado a la base de datos
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); a
la base de datos
3. Actualizar el estado de la subtabla DataRowState es: Registros agregados y modificados
... //Código omitido, similar a la actualización de la tabla 2 principal
4. Actualizar el estado de la subtabla DataRowState: Registros eliminados
... .... // Código omitido, similar al 5 siguiente
5. Actualice el estado de DataRowState de la tabla principal a: Registros eliminados
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain" // Actualiza el conjunto de registros modificado en la base de datos).
¡Gracias por leer!