DataSet.Merge() does not merge row and/or column errors in any cas

G

Guest

I save changes from a dataset and get them with

tempDataSet = myDataSet.GetChanges()

I validate the changed rows and if I find an error, I mark the row with

tempDataSet.DataTable.Row[..].SetColumnError(...)

coming back from validation, tempDataSet.HasErrors is true, that's ok.

Then I merge the datas for giving back the errors:

myDataSet.Merge(tempDataSet)

Unfortunately in some cases myDataSet.HasError is then false, though there
is still an error. Does any one know how to force the Merge method to copy
also the error settings of the dataset to merge in every case?

PS. This error occurs mostly when there is a parent-child relation between
two tables. If the parent row is added without child, the error is reported
to myDataSet. If the errorneous parent row has one child, the errorsetting of
parent row is not merged into myDataSet. Once again: tempDataSet returns
ALWAYS with HasErrors=true, when SetErrror has been executed.
 
S

Sahil Malik [MVP C#]

DataSet.Merge is a bit weird. There are two things that govern the output
result

a) Who is the boss. Ds1.Merge(ds2) <-- ds1 is the boss.
b) What schema information have you specified?

Regards the HasErrors - without actually writing up code at my end, I would
try specifying Primary Keys on both Ds1 and Ds2, and try once again - if it
still eats up the errors .. uhhh .. bad luck :).
I vaguely remember having this problem myself, I am inclined to say that I
reversed the direction of the merge ds2.merge(ds1) and got out of it - but
if both sides have errors, then you're screwed. But this is such an isolated
case that I would write code to verify this statement.

Anyway, I vaguely recollecting facing this problem myself, so not much I
could add.

- Sahil Malik [MVP]
ADO.NET 2.0 book -
http://codebetter.com/blogs/sahil.malik/archive/2005/05/13/63199.aspx
__________________________________________________________
 
G

Guest

Hi Sahil
Thanks for your answer.

I checked my schema definitions and I guess they are correct. If you want
you can have a look on them. I added schema definitions (xsd) after this
text. It is just a simple master-detail relation with invoices and the
invoice positions. The boss is Ds1. I can't merge it by the Ds2.Merge(Ds1),
because some navigators and error providers are connected with Ds1.

Once again: ds2 returns always with the correct error setting and returns
with ds.HasErrors = true. It is after the Ds1.Merge(ds2) that Ds1.HasErrors
has unfortunately false. If there is no workaround I will make by my self a
procedure that copies the errors form Ds2 to Ds1.

Thanks
Hans Weber

InvoiceDataSet.cs
------------------------
private void InitClass() {
this.DataSetName = "InvoiceDataSet";
this.Prefix = "";
this.Namespace = "http://xxx/Rmg/InvoiceDataSet";
this.Locale = new System.Globalization.CultureInfo("de-CH");
this.CaseSensitive = false;
this.EnforceConstraints = true;
this.tableInvoice = new InvoiceDataTable();
this.Tables.Add(this.tableInvoice);
this.tableInvoicespositionX = new InvoicespositionXDataTable();
this.Tables.Add(this.tableInvoicespositionX);
ForeignKeyConstraint fkc;
fkc = new ForeignKeyConstraint("Invoice_Invoicesposition", new
DataColumn[] {
this.tableInvoice.RecUIDColumn}, new DataColumn[] {
this.tableInvoicespositionX.RecIDColumn});
this.tableInvoicespositionX.Constraints.Add(fkc);
fkc.AcceptRejectRule = System.Data.AcceptRejectRule.None;
fkc.DeleteRule = System.Data.Rule.Cascade;
fkc.UpdateRule = System.Data.Rule.Cascade;
this.relationInvoice_Invoicesposition = new
DataRelation("Invoice_Invoicesposition", new DataColumn[] {
this.tableInvoice.RecUIDColumn}, new DataColumn[] {
this.tableInvoicespositionX.RecIDColumn}, false);
this.Relations.Add(this.relationInvoice_Invoicesposition);
}

InvoiceDataSet.xsd
-------------------------

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="InvoiceDataSet"
targetNamespace="http://xxx/Rmg/InvoiceDataSet"
xmlns:mstns="http://xxx/Rmg/InvoiceDataSet"
xmlns="http://xxx/Rmg/InvoiceDataSet"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
attributeFormDefault="qualified" elementFormDefault="qualified"
xmlns:app1="http://xxx/Rmg/Invoice"
xmlns:app2="http://xxx/Rmg/InvoicespositionX">
<!--ATTENTION: This schema contains references to other imported schemas-->
<xs:import namespace="http://xxx/Rmg/Invoice"
schemaLocation="Rmg/Invoice_table.xsd" />
<xs:import namespace="http://xxx/Rmg/InvoicespositionX"
schemaLocation="Rmg/InvoicespositionX_table.xsd" />
<xs:element name="InvoiceDataSet" msdata:IsDataSet="true"
msdata:Locale="de-CH">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="app1:Invoice" />
<xs:element ref="app2:InvoicespositionX" />
</xs:choice>
</xs:complexType>
<xs:unique name="InvoicePK" msdata:primaryKey="true">
<xs:selector xpath=".//app1:Invoice" />
<xs:field xpath="app1:RecUID" />
</xs:unique>
<xs:unique name="InvoicespositionXPK" msdata:primaryKey="true">
<xs:selector xpath=".//app2:InvoicespositionX" />
<xs:field xpath="app2:RcpUID" />
</xs:unique>
<xs:keyref name="Invoice_Invoicesposition" refer="InvoicePK">
<xs:selector xpath=".//app2:InvoicespositionX" />
<xs:field xpath="app2:RecID" />
</xs:keyref>
</xs:element>
</xs:schema>

Invoice_table.xsd
---------------------

<?xml version="1.0"?>
<xs:schema xmlns="http://xxx/Rmg/Invoice"
targetNamespace="http://xxx/Rmg/Invoice"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="Invoice_type.xsd" />
<xs:element name="Invoice" type="InvoiceType" />
</xs:schema>


Invoiceposition_table.xsd
--------------------------------

<?xml version="1.0"?>
<xs:schema xmlns="http://xxx/Rmg/Invoicesposition"
targetNamespace="http://xxx/Rmg/Invoicesposition"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="Invoicesposition_type.xsd" />
<xs:element name="Invoicesposition" type="InvoicespositionType" />
</xs:schema>

Invoice_type.xsd
-------------------------

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="InvoiceType">
<xs:sequence>
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="RecUID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="OrgID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="NacID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="MwstID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element name="RecNummer">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RecEingangsdatum" type="xs:dateTime" />
<xs:element name="RecDatum" type="xs:dateTime" />
<xs:element name="RecMonat" type="xs:short" />
<xs:element name="RecJahr" type="xs:short" />
<xs:element name="RecFolgeNr" type="xs:int" />
<xs:element name="RecBetrag" type="xs:decimal" />
<xs:element minOccurs="0" name="RecBemerkung">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="4000" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RecCreatedBy">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="128" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RecCreatedAt" type="xs:dateTime" />
<xs:element minOccurs="0" name="RecChangedBy">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="128" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RecChangedAt" type="xs:dateTime" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="RecChangeSeq" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
</xs:sequence>
</xs:complexType>
</xs:schema>

Invoiceposition_type.xsd
-----------------------------

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="InvoicespositionType">
<xs:sequence>
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="RcpUID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="RecID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="AufID" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
<xs:element name="RcpNummer" type="xs:int" />
<xs:element name="RcpBetrag" type="xs:decimal" />
<xs:element minOccurs="0" name="RcpBemerkung">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="4000" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RcpCreatedBy">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="128" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RcpCreatedAt" type="xs:dateTime" />
<xs:element minOccurs="0" name="RcpChangedBy">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="128" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RcpChangedAt" type="xs:dateTime" />
<xs:element msdata:DataType="System.Guid, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="RcpChangeSeq" type="xs:string"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
</xs:sequence>
</xs:complexType>
</xs:schema>

Sahil Malik said:
DataSet.Merge is a bit weird. There are two things that govern the output
result

a) Who is the boss. Ds1.Merge(ds2) <-- ds1 is the boss.
b) What schema information have you specified?

Regards the HasErrors - without actually writing up code at my end, I would
try specifying Primary Keys on both Ds1 and Ds2, and try once again - if it
still eats up the errors .. uhhh .. bad luck :).
I vaguely remember having this problem myself, I am inclined to say that I
reversed the direction of the merge ds2.merge(ds1) and got out of it - but
if both sides have errors, then you're screwed. But this is such an isolated
case that I would write code to verify this statement.

Anyway, I vaguely recollecting facing this problem myself, so not much I
could add.

- Sahil Malik [MVP]
ADO.NET 2.0 book -
http://codebetter.com/blogs/sahil.malik/archive/2005/05/13/63199.aspx
__________________________________________________________


Hans Weber said:
I save changes from a dataset and get them with

tempDataSet = myDataSet.GetChanges()

I validate the changed rows and if I find an error, I mark the row with

tempDataSet.DataTable.Row[..].SetColumnError(...)

coming back from validation, tempDataSet.HasErrors is true, that's ok.

Then I merge the datas for giving back the errors:

myDataSet.Merge(tempDataSet)

Unfortunately in some cases myDataSet.HasError is then false, though there
is still an error. Does any one know how to force the Merge method to copy
also the error settings of the dataset to merge in every case?

PS. This error occurs mostly when there is a parent-child relation between
two tables. If the parent row is added without child, the error is
reported
to myDataSet. If the errorneous parent row has one child, the errorsetting
of
parent row is not merged into myDataSet. Once again: tempDataSet returns
ALWAYS with HasErrors=true, when SetErrror has been executed.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top