c#数据表中对数据列的约束
本文关键字:约束 数据 数据表 | 更新日期: 2023-09-27 18:02:53
是否可以在c#中创建数据表的值范围约束?
我正在动态地向DataTable添加一个列:
this.PrimaryCorrelationMatrix.Columns.Add(sName, typeof(int));
,但我希望这列中的所有值都是从[0,10]的整数。我可以直接在DataTable上实现这样的约束吗?
我能想到的下一个最佳选择是创建一些可能值为[0,10]的对象,而不是typeof(int),而是typeof(specialObj)。
一种方法是检查DataTable的ColumnChanging事件中的e.ProposedValue
要在特定列上具有约束,可以使用DataColumn的ExtendedProperties集合作为检查这些约束的标志:
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;
在ColumnChanging事件中,您将检查这些属性是否存在,然后使用它们:
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;
}
}
我可以建议您忘记数据表而使用类。您可以使用数据注释来验证您的模型。
使用此属性验证特定属性的值范围/
这段代码是从指定的文章中提取的(类验证范围的例子):
public class Product
{
[Range(5, 50)]
public int ReorderLevel { get; set; }
[Range(typeof(Decimal),"5", "5000")]
public decimal ListPrice { get; set; }
}
你会发现使用类有很多好处。
这是一个旧的帖子,但我正在使用一个解决方案来同步Check_Constraints NOT由OleDbDataAdapter填充。Access数据库上的FillSchema值得一提。只是使用OleDbConnection来检索GetOleDbSchemaTable和foreach()提取验证文本表达式的行,并在适当的表上创建匿名委托&列附加到适当的表。ColumnChanging事件。然后,Access模式提供的字符串验证将由这里描述的方便的Eval()函数动态计算。这是我的代码:
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);
}
}