(c) 2003 Visual Studio Magazine 
Fawcette Technical Publications

XML	Enhance the DataSet XML Schema
Listing 1	You can enhance the DataSet XML schema  the VS.NET designer generates to declare validation constraints at the field, row, table, and DataSet levels.

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema ... omitted >
<xs:element name="CustomerOrders" msdata:IsDataSet="true"  
	msprop:ruleassembly="BoOrders" <!-- DS level 
	validation -->
	msprop:ruleclass="ValidationRules.CValidateDs">
	<xs:complexType>
	 <xs:choice maxOccurs="unbounded">
	<xs:element name="Customers" 
		msprop:ruleassemblyrow="BoOrders" 
			<!-- Row level validation -->
		msprop:ruleclassrow=
			"ValidationRules.customerrowvalidate" 
	msprop:ruleassemblytable=
			"BoOrders" <!-- Table level validation -->
	msprop:ruleclasstable=
		"ValidationRules.customertablevalidate">
	<xs:complexType>
	<xs:sequence>
		<xs:element name="ShipName" type=
			"xs:string" minOccurs="0" 
		msprop:ruleassembly="BoOrders" 
			<!-- Field level validation -->
		msprop:ruleclass=
			"ValidationRules.shipnamefieldvalidate" />
		<xs:element name="Email" type=
			"xs:string" minOccurs="0" 
			<!-- Field level validation using regular 
				expressions -->
msprop:regexpconstraint=
		"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" />
		<!-- simple field validation: field can't be 
			null -->
	 <xs:element name="CompanyName" type="xs:string" 
		msprop:required= "true"/>
...
/>


C#	Trigger Validations
Listing 2	The SmartDS class's OnColumnChanging method intercepts all data-field changes and triggers any associated validation checks that the DataSet XML schema declares for the relevant column.

virtual protected void OnColumnChanging(
	 object sender, DataColumnChangeEventArgs e) {
	string l_erdescr;
//Module Hook Validation
if (e.Column.ExtendedProperties.Contains 
	("ruleassembly")) {
	string l_ruleassembly = e.Column.ExtendedProperties[
		"ruleassembly"].ToString ();
	string l_ruleclass= 
		e.Column.ExtendedProperties[
		"ruleclass"].ToString ();
	ValidationRulesBase.IValidateProp l_iv =
		(ValidationRulesBase.IValidateProp)
		(Activator.CreateInstance 
	(l_ruleassembly,l_ruleclass).Unwrap());
	l_iv.validateProp(e.Row ,e.Column.ColumnName 
		,e.ProposedValue,out l_erdescr); 
}
//Required Value Validation
else if (e.Column.ExtendedProperties.Contains 
	("required")) {
	if (e.ProposedValue.ToString ()=="") {
	throw new Exception ("This field can't be empty");
	}
}
//Regular Expression Validation
else if (e.Column.ExtendedProperties.Contains 
	("regexpconstraint")) {
	int l_ret = 
	ValidationRulesBase.CRegExValidate.ValidateRegEx (
	e.Column.ExtendedProperties[
		"regexpconstraint"].ToString (),
		e.ProposedValue.ToString (),out l_erdescr);
	if(l_ret != 0) {
		throw new Exception ("validation failed. regexp: " +  
		e.Column.ExtendedProperties.Contains 
		("regexpconstraint") +
	" value: " + e.ProposedValue );
	}
	}
}
