From bee2709f2ecd4397fea173c90b49642ee0b8f955 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 25 Jul 2014 13:11:56 +0300 Subject: [PATCH 1/2] Unit test to reproduce #179 --- tests/DataAdapterTests.cs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/DataAdapterTests.cs b/tests/DataAdapterTests.cs index 538a687af7..b3367cb323 100644 --- a/tests/DataAdapterTests.cs +++ b/tests/DataAdapterTests.cs @@ -23,6 +23,7 @@ using System; using System.Data; +using System.Data.SqlClient; using System.Web.UI.WebControls; using Npgsql; @@ -419,6 +420,31 @@ public void DbDataAdapterCommandAccess() System.Data.Common.DbDataAdapter common = da; Assert.IsNotNull(common.SelectCommand); } + + [Test, Description("Makes sure that the INSERT/UPDATE/DELETE commands are auto-populated on NpgsqlDataAdapter (issue #179)")] + public void AutoPopulateAdapterCommands() + { + var da = new NpgsqlDataAdapter("SELECT field_pk,field_int4 FROM data", Conn); + var builder = new NpgsqlCommandBuilder(da); + var ds = new DataSet(); + da.Fill(ds); + + var table = ds.Tables[0]; + var row = table.NewRow(); + row["field_pk"] = 1; + row["field_int4"] = 8; + table.Rows.Add(row); + da.Update(ds); + Assert.That(ExecuteScalar(@"SELECT field_int4 FROM data"), Is.EqualTo(8)); + + row["field_int4"] = 9; + da.Update(ds); + Assert.That(ExecuteScalar(@"SELECT field_int4 FROM data"), Is.EqualTo(9)); + + row.Delete(); + da.Update(ds); + Assert.That(ExecuteScalar(@"SELECT COUNT(*) FROM data"), Is.EqualTo(0)); + } } /* [TestFixture] From 9940744cb70695bb8159916b52ffee8340bd01cc Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 25 Jul 2014 13:14:24 +0300 Subject: [PATCH 2/2] Fix CommandBuilder event registration CommandBuilder wasn't properly registering to its DataAdapter events, resulting in bug #179 --- Npgsql/Npgsql/NpgsqlCommandBuilder.cs | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/Npgsql/Npgsql/NpgsqlCommandBuilder.cs b/Npgsql/Npgsql/NpgsqlCommandBuilder.cs index b9daa147ae..7ae71b83fe 100644 --- a/Npgsql/Npgsql/NpgsqlCommandBuilder.cs +++ b/Npgsql/Npgsql/NpgsqlCommandBuilder.cs @@ -433,24 +433,15 @@ protected override string GetParameterPlaceholder(int parameterOrdinal) /// The to be used for the update. protected override void SetRowUpdatingHandler(DbDataAdapter adapter) { + var npgsqlAdapter = adapter as NpgsqlDataAdapter; + if (npgsqlAdapter == null) + throw new ArgumentException("adapter needs to be a NpgsqlDataAdapter", "adapter"); - /* Disabling this handler makes the ado.net updating code works. - * Check if this code is really necessary or how to implement it correctly. - * By having this handler specified, ADO.Net was reusing strangely NpgsqlParameters when updating datasets. - * See bug 1010973 for more info. - */ - - /* - if (!(adapter is NpgsqlDataAdapter)) - { - throw new InvalidOperationException("adapter needs to be a NpgsqlDataAdapter"); - } - - this.rowUpdatingHandler = new NpgsqlRowUpdatingEventHandler(this.RowUpdatingHandler); - - ((NpgsqlDataAdapter) adapter).RowUpdating += this.rowUpdatingHandler; - */ - + // Being called twice for the same adapter means unregister + if (adapter == DataAdapter) + npgsqlAdapter.RowUpdating -= RowUpdatingHandler; + else + npgsqlAdapter.RowUpdating += RowUpdatingHandler; } /// @@ -459,7 +450,6 @@ protected override void SetRowUpdatingHandler(DbDataAdapter adapter) /// The sender /// A instance containing information about the event. private void RowUpdatingHandler(object sender, NpgsqlRowUpdatingEventArgs e) - { base.RowUpdatingHandler(e); }