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);
}
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]