Restricción en DataColumn en C#DataTable?
.net constraints (3)
Esta es una publicación anterior, pero estoy usando una solución para sincronizar las Check_Constraints NO completadas por OleDbDataAdapter.FillSchema en bases de datos Access dignas de mencionar. Solo usé un OleDbConnection para recuperar GetOleDbSchemaTable y foreach () las filas extrayendo la expresión de texto de validación y creé un delegado anónimo en la Tabla y Columna apropiada unida al evento Table.ColumnChanging apropiado. La validación de cadenas proporcionada por el esquema de acceso se evaluará dinámicamente mediante la práctica función Eval () descrita aquí . Ahí está mi código:
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Check_Constraints, null);
// Attach delegate Eval() of each Check_Constraints on proper Table/Column
foreach (DataRow myField in schemaTable.Rows)
{
string constraint_name = "";
string check_clause = "";
foreach (DataColumn myProperty in schemaTable.Columns)
{
if (myProperty.ColumnName == "CONSTRAINT_NAME")
constraint_name = myField[myProperty.ColumnName].ToString();
if (myProperty.ColumnName == "CHECK_CLAUSE")
check_clause = myField[myProperty.ColumnName].ToString();
}
var rule = constraint_name.Replace("[", "").Replace("]", "").Split(''.'');
if (rule.Length == 3 && dataset.Tables.Contains(rule[0]) && dataset.Tables[rule[0]].Columns.Contains(rule[1]) && String.IsNullOrEmpty(check_clause) == false)
{
dataset.Tables[rule[0]].ColumnChanging += delegate (object sender, DataColumnChangeEventArgs e)
{
if (e.Column.ColumnName == rule[1] && Convert.ToBoolean(ToolBox.Eval(e.ProposedValue + check_clause)) == false)
{
throw new Exception("Tabela: " + rule[0] + ", coluna: " + rule[0] + ", cheque: " + check_clause);
}
};
Debug.WriteLine(rule[0] + "." + rule[1] + ": " + check_clause);
}
}
¿Es posible crear una restricción de rango de valores en una DataTable en C #?
Estoy agregando dinámicamente una columna a una DataTable:
this.PrimaryCorrelationMatrix.Columns.Add(sName, typeof(int));
pero me gustaría que todos los valores dentro de esta columna sean enteros de [0, 10]. ¿Puedo implementar tal restricción directamente en DataTable?
La siguiente mejor opción que puedo pensar es crear algún objeto con posibles valores [0, 10], y en lugar de typeof (int), usando typeof (specialObj).
Te puedo recomendar que olvides las tablas de datos y las clases de uso. Puede usar la anotación de datos para validar su modelo.
Use este atributo para validar un rango de valores para una propiedad específica /
Este código se extrae del artículo especificado (ejemplo de clase que hace la validación de un rango):
public class Product
{
[Range(5, 50)]
public int ReorderLevel { get; set; }
[Range(typeof(Decimal),"5", "5000")]
public decimal ListPrice { get; set; }
}
Tu vas a encontrar muchos beneficios de usar clases.
Una forma de hacerlo es inspeccionar e.ProposedValue
en el evento ColumnChanging de DataTable.
Para tener la restricción en una columna en particular, puede usar la colección ExtendedProperties de DataColumn para actuar como su indicador para verificar esas restricciones:
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("Range", typeof(int));
dc.ExtendedProperties.Add("Min", 0);
dc.ExtendedProperties.Add("Max", 10);
dt.Columns.Add(dc);
dt.ColumnChanging += dt_ColumnChanging;
En el evento ColumnChanging, debe verificar si esas propiedades existen y luego usarlas:
void dt_ColumnChanging(object sender, DataColumnChangeEventArgs e) {
if (e.Column.ExtendedProperties.ContainsKey("Min") &&
e.Column.ExtendedProperties.ContainsKey("Max")) {
int min = (int)e.Column.ExtendedProperties["Min"];
int max = (int)e.Column.ExtendedProperties["Max"];
if ((int)e.ProposedValue < min) e.ProposedValue = min;
if ((int)e.ProposedValue > max) e.ProposedValue = max;
}
}