Dave
Wed Nov 22 01:00:00 CST 2006
Hi Chris,
I still can't reproduce the problem. I followed your specifications and
wrote the following code, which results in no errors, 3 records persisted in
the parent database table and all related child records having a RowState of
Added:
// Note: I tried with an auto-increment PK and with a string PK
// and both produced the same results
DataSet data = new DataSet();
DataTable parent = data.Tables.Add("ParentTable");
DataColumn pk = parent.Columns.Add("ParentID", typeof(int));
pk.AutoIncrement = true;
pk.AllowDBNull = false;
pk.ReadOnly = true;
parent.Constraints.Add("PK_ParentID", pk, true);
parent.Columns.Add("Text", typeof(string));
DataTable child = data.Tables.Add("ChildTable");
child.Columns.Add("ChildID", typeof(string));
child.Columns.Add("ParentID", typeof(int));
ForeignKeyConstraint foreignKeyConstraint =
(ForeignKeyConstraint) child.Constraints.Add("FK_Child_Parent",
parent.Columns[0], child.Columns[1]);
foreignKeyConstraint.UpdateRule = Rule.Cascade;
child.Rows.Add("C1",
parent.Rows.Add(null, "P1")["ParentID"]);
child.Rows.Add("C2",
parent.Rows.Add(null, "P2")["ParentID"]);
child.Rows.Add("C3",
parent.Rows.Add(null, "P3")["ParentID"]);
foreach (DataRow row in parent.Rows)
Debug.Assert(row.RowState == DataRowState.Added);
foreach (DataRow row in child.Rows)
Debug.Assert(row.RowState == DataRowState.Added);
using (SqlConnection connection = new SqlConnection(
Properties.Settings.Default.TestingConnectionString))
{
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
using (SqlCommand command = new SqlCommand(
@"INSERT ParentTable SELECT @Text;
SELECT SCOPE_IDENTITY();", connection))
{
command.Parameters.Add("@Text", SqlDbType.NVarChar, 50, "Text");
adapter.AcceptChangesDuringUpdate = false;
adapter.InsertCommand = command;
adapter.Update(parent); // parent is a DataTable
}
}
}
foreach (DataRow row in parent.Rows)
// check for Modified since pk is updated by adapter
Debug.Assert(row.RowState == DataRowState.Modified,
row["Text"].ToString() + ": Invalid parent RowState: " +
row.RowState.ToString());
foreach (DataRow row in child.Rows)
Debug.Assert(row.RowState == DataRowState.Added,
row["ChildID"].ToString() + ": Invalid child RowState: " +
row.RowState.ToString());
MessageBox.Show("Done!");
--
Dave Sexton
"Chris Bordeman"
<REMOVE_DUPED_LETTERSccchhrriiiissbbooooorrddeemmaann@hhoottmmaaiill.com>
wrote in message news:evpgYjfDHHA.4680@TK2MSFTNGP04.phx.gbl...
> I'm too lazy now to work up an example project but here are some posts by
> people having the same problem:
>
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=928845&SiteID=1
>
> Here's how to reproduce:
>
> Create a dataset, add 2 tables and a relationship with cascading updates
> between the two and add some new rows to both tables. All rows will have
> a RowStatus of 'Added'.
>
> Use a dataadapter to update the parent table, with
> AcceptChangesDuringUpdate set to false.
>
> You'll see the RowStatus of all the rows in the child table are changed to
> 'Modified.'
>
>
> "Dave Sexton" <dave@jwa[remove.this]online.com> wrote in message
> news:%23%23DCuRbDHHA.4844@TK2MSFTNGP02.phx.gbl...
>> Hi Chris,
>>
>> I've never observed anything like that, even when UpdateRule is set to
>> Cascade for ForeignKeyConstraints.
>>
>> Could you post some short but complete code that reproduces the problem?
>>
>> (See Jon Skeet's article,
>>
http://www.yoda.arachsys.com/csharp/complete.html for a description on
>> "short but complete")
>>
>> --
>> Dave Sexton
>>
>> "Chris Bordeman"
>> <REMOVE_DUPED_LETTERSccchhrriiiissbbooooorrddeemmaann@hhoottmmaaiill.com>
>> wrote in message news:%23LaZfvaDHHA.4604@TK2MSFTNGP06.phx.gbl...
>>> Hi all. .Net 2.0.
>>>
>>> It seems the DataAdapter.Update Method changes the RowState of child
>>> records to 'Modified' when updating them through a Relation.
>>>
>>> If the child records' .RowState is "Added" or "Deleted," shouldn't they
>>> STAY that way? Otherwise when you try to update the child table, you
>>> get concurrency errors (record doesn't exist to update) or records fail
>>> to delete.
>>>
>>> Chris B.
>>>
>>
>>
>
>