Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede utilizar restricciones para imponer límites a los datos en DataTable, con el fin de mantener la integridad de los mismos. Una restricción es una regla automática, aplicada a una columna o columnas relacionadas, que determina el curso de acción cuando el valor de una fila se modifica de alguna manera. Las restricciones se aplican cuando la System.Data.DataSet.EnforceConstraints
propiedad de DataSet es true. Para obtener un ejemplo de código que muestra cómo establecer la EnforceConstraints
propiedad, vea el EnforceConstraints tema de referencia.
Hay dos tipos de restricciones en ADO.NET: el ForeignKeyConstraint y el UniqueConstraint. De forma predeterminada, ambas restricciones se crean automáticamente al establecer una relación entre dos o más tablas al añadir un DataRelation al DataSet. Sin embargo, puede deshabilitar este comportamiento especificando createConstraints = false al crear la relación.
ForeignKeyConstraint
Un Elemento ForeignKeyConstraint aplica reglas sobre cómo se propagan las actualizaciones y las eliminaciones a las tablas relacionadas. Por ejemplo, si un valor de una fila de una tabla se actualiza o elimina, y ese mismo valor también se usa en una o varias tablas relacionadas, foreignKeyConstraint determina lo que sucede en las tablas relacionadas.
Las DeleteRule propiedades y UpdateRule de ForeignKeyConstraint definen la acción que se realizará cuando el usuario intenta eliminar o actualizar una fila en una tabla relacionada. En la tabla siguiente se describen las distintas opciones disponibles para las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint.
Configuración de regla | Descripción |
---|---|
Cascada | Elimine o actualice las filas relacionadas. |
SetNull | Establezca valores en filas relacionadas en DBNull. |
SetDefault | Establezca valores en filas relacionadas con el valor predeterminado. |
Ninguno | No realiza ninguna acción en las filas relacionadas. Este es el valor predeterminado. |
ForeignKeyConstraint puede restringir, así como propagar, los cambios en las columnas relacionadas. Dependiendo de las propiedades establecidas para ForeignKeyConstraint de una columna, si la propiedad EnforceConstraints de DataSet es true, realizar ciertas operaciones en la fila primaria producirá una excepción. Por ejemplo, si la propiedad DeleteRule de ForeignKeyConstraint es None, no se puede eliminar una fila primaria si tiene filas secundarias.
Puede crear una restricción de clave externa entre columnas únicas o entre una matriz de columnas mediante el constructor ForeignKeyConstraint . Pase el objeto ForeignKeyConstraint resultante al método Add de la propiedad Constraints de la tabla, que es constraintCollection. También puede pasar argumentos de constructor a varias sobrecargas del método Add de ConstraintCollection para crear una ForeignKeyConstraint.
Al crear un elemento ForeignKeyConstraint, puede pasar los valores DeleteRule y UpdateRule al constructor como argumentos, o bien puede establecerlos como propiedades como en el ejemplo siguiente (donde el valor DeleteRule se establece en None).
Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
custDS.Tables("CustTable").Columns("CustomerID"), _
custDS.Tables("OrdersTable").Columns("CustomerID"))
custOrderFK.DeleteRule = Rule.None
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
Regla de Aceptación/Rechazo
Los cambios en las filas se pueden aceptar mediante el método AcceptChanges o cancelarse mediante el método RejectChanges del DataSet, DataTable o DataRow. Cuando un Objeto DataSet contiene ForeignKeyConstraints, invocar los métodos AcceptChanges o RejectChanges aplica acceptRejectRule. La propiedad AcceptRejectRule de ForeignKeyConstraint determina qué acción se tomará en las filas secundarias cuando se llame a AcceptChanges o RejectChanges en la fila primaria.
En la tabla siguiente se enumeran los valores disponibles para AcceptRejectRule.
Configuración de regla | Descripción |
---|---|
Cascada | Acepta o rechaza los cambios en filas secundarias. |
Ninguno | No realiza ninguna acción en las filas secundarias. Este es el valor predeterminado. |
Ejemplo
En el siguiente ejemplo, se crea un ForeignKeyConstraint, se establecen varias de sus propiedades, incluido el AcceptRejectRule, y se añade al ConstraintCollection de un objeto DataTable.
static void CreateConstraint(DataSet dataSet,
string table1, string table2, string column1, string column2)
{
// Declare parent column and child column variables.
DataColumn parentColumn, childColumn;
ForeignKeyConstraint foreignKeyConstraint;
// Set parent and child column variables.
parentColumn = dataSet.Tables[table1]?.Columns[column1] ??
throw new NullReferenceException($"{nameof(CreateConstraint)}: {table1}.{column1} not found");
childColumn = dataSet.Tables[table2]?.Columns[column2] ??
throw new NullReferenceException($"{nameof(CreateConstraint)}: {table2}.{column2} not found");
foreignKeyConstraint = new ForeignKeyConstraint
("SupplierForeignKeyConstraint", parentColumn, childColumn)
{
// Set null values when a value is deleted.
DeleteRule = Rule.SetNull,
UpdateRule = Rule.Cascade,
AcceptRejectRule = AcceptRejectRule.None
};
// Add the constraint, and set EnforceConstraints to true.
dataSet.Tables[table1]?.Constraints.Add(foreignKeyConstraint);
dataSet.EnforceConstraints = true;
}
Private Sub CreateConstraint(dataSet As DataSet, _
table1 As String, table2 As String, _
column1 As String, column2 As String)
' Declare parent column and child column variables.
Dim parentColumn As DataColumn
Dim childColumn As DataColumn
Dim foreignKeyConstraint As ForeignKeyConstraint
' Set parent and child column variables.
parentColumn = dataSet.Tables(table1).Columns(column1)
childColumn = dataSet.Tables(table2).Columns(column2)
foreignKeyConstraint = New ForeignKeyConstraint _
("SupplierForeignKeyConstraint", parentColumn, childColumn)
' Set null values when a value is deleted.
foreignKeyConstraint.DeleteRule = Rule.SetNull
foreignKeyConstraint.UpdateRule = Rule.Cascade
foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None
' Add the constraint, and set EnforceConstraints to true.
dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
dataSet.EnforceConstraints = True
End Sub
Restricción Única
El objeto UniqueConstraint , que se puede asignar a una sola columna o a una matriz de columnas de dataTable, garantiza que todos los datos de la columna o columnas especificadas sean únicos por fila. Puede crear una restricción única para una columna o matriz de columnas mediante el constructor UniqueConstraint . Pase el objeto UniqueConstraint resultante al método Add de la propiedad Constraints de la tabla, que es constraintCollection. También puede pasar argumentos de constructor a varias sobrecargas del método Add de una ConstraintCollection para crear una UniqueConstraint. Al crear un objeto UniqueConstraint para una columna o columnas, puede especificar opcionalmente si la columna o columnas son una clave principal.
También puede crear una restricción única para una columna estableciendo la propiedad Unique de la columna en true. Como alternativa, al establecer la propiedad Unique de una sola columna en false , se quita cualquier restricción única que pueda existir. Definir una columna o columnas como clave principal para una tabla creará automáticamente una restricción única para la columna o columnas especificadas. Si quita una columna mediante la propiedad PrimaryKey de una DataTable, se quita la UniqueConstraint.
En el ejemplo siguiente se crea un objeto UniqueConstraint para dos columnas de dataTable.
Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUnique As UniqueConstraint = _
New UniqueConstraint(New DataColumn() {custTable.Columns("CustomerID"), _
custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUnique)
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]
{custTable.Columns["CustomerID"],
custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUnique);