[ADO.NET] AcceptChangesすると、DataAdapter経由でDBが更新されない
- 2010 6/30
- 投稿者 : flied_onion
AcceptChangesすると、DataAdapter経由でDBが更新されません。
下のコメントをとると、DataRowVersionがNoChangeになるため。
// dr.AcceptChanges();
sda.Update(ds,"Table_1");
タグ : DataAdapter
AcceptChangesすると、DataAdapter経由でDBが更新されません。
下のコメントをとると、DataRowVersionがNoChangeになるため。
// dr.AcceptChanges();
sda.Update(ds,"Table_1");
ポイントはmyParam=のとこと、OnRowUpdatedイベント
『DataAdapter.RowUpdated イベント
これまでに説明した方法に関連して DataAdapter.RowUpdated イベントを使用すると、オプティミスティック同時実行制御違反をアプリケーションに通知できます。RowUpdated は、DataSet から Modified 行の更新を行ったときに発生します。これにより、例外発生時の処理、カスタム エラー情報の追加、再試行ロジックの追加などの特別の処理コードを追加できます。RowUpdatedEventArgs オブジェクトは、テーブルの変更行に対する特定の更新コマンドによって影響された行数が設定された RecordsAffected プロパティを返します。オプティミスティック同時実行制御をテストするように更新コマンドを設定した場合は、オプティミスティック同時実行制御違反の発生時に、RecordsAffected プロパティは値 0 を結果として返します。値が 0 なのはレコードが更新されないためです。この場合、例外がスローされます。RowUpdated イベントを使用すると、発生したイベントを処理したり、UpdateStatus.SkipCurrentRow のような RowUpdatedEventArgs.Status 値を設定することで例外を抑止したりできます。RowUpdated イベントの詳細については、「DataAdapter イベントの使用」を参照してください
』
[C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"); SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers ORDER BY CustomerID", nwindConn); // The Update command checks for optimistic concurrency violations in the WHERE clause. custDA.UpdateCommand = new SqlCommand("UPDATE Customers (CustomerID, CompanyName) VALUES(@CustomerID, @CompanyName) " + "WHERE CustomerID = @oldCustomerID AND CompanyName = @oldCompanyName", nwindConn); custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 30, "CompanyName"); // Pass the original values to the WHERE clause parameters. SqlParameter myParm; myParm = custDA.UpdateCommand.Parameters.Add("@oldCustomerID", SqlDbType.NChar, 5, "CustomerID"); myParm.SourceVersion = DataRowVersion.Original; myParm = custDA.UpdateCommand.Parameters.Add("@oldCompanyName", SqlDbType.NVarChar, 30, "CompanyName"); myParm.SourceVersion = DataRowVersion.Original; // Add the RowUpdated event handler. custDA.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated); DataSet custDS = new DataSet(); custDA.Fill(custDS, "Customers"); // Modify the DataSet contents. custDA.Update(custDS, "Customers"); foreach (DataRow myRow in custDS.Tables["Customers"].Rows) { if (myRow.HasErrors) Console.WriteLine(myRow[0] + "\n" + myRow.RowError); } protected static void OnRowUpdated(object sender, SqlRowUpdatedEventArgs args) { if (args.RecordsAffected == 0) { args.Row.RowError = "Optimistic Concurrency Violation Encountered"; args.Status = UpdateStatus.SkipCurrentRow; } } |
seeAlso:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconoptimisticconcurrency.asp
note:UpdateCommand Original ADO.NET でGoogle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
namespace DataSetUpdateTest { class Program { static void Main(string[] args) { string response; DataSet ds = new System.Data.DataSet(); DataRow dr; DataSet newDs; DataRow[] rowsInError; DataTable newDt; DataColumn newCol; int i; SqlConnection sc = new SqlConnection(); sc.ConnectionString = "Data Source=PD3GCOT\\SQLEXPRESS;User ID=sa;Password=sa;" + "Initial Catalog=mydb;"; SqlDataAdapter sda = new SqlDataAdapter("Select * from Table_1;",sc); SqlCommandBuilder cb = new SqlCommandBuilder(sda); sc.Open(); sda.MissingSchemaAction = MissingSchemaAction.AddWithKey; sda.Fill(ds, "Table_1"); /* ds.EnforceConstraints = true; ds.SchemaSerializationMode = SchemaSerializationMode.IncludeSchema; ds.WriteXmlSchema("c:\\file.xsd"); */ ds.Tables["Table_1"].Rows[0].Delete(); DataRow delRow; if (ds.HasChanges(DataRowState.Deleted)) { newDs = ds.GetChanges(DataRowState.Deleted); if (!newDs.HasErrors) { delRow = newDs.Tables["Table_1"].Rows[0]; dr = ds.Tables["Table_1"].Rows[0]; try { // the following line generates the exception Console.WriteLine(delRow[0]); } catch (Exception e) { Console.WriteLine("01:" + e.Message); } try { Console.WriteLine(delRow[0, DataRowVersion.Original]); } catch (Exception e) { Console.WriteLine("02:" + e.Message); } try { Console.WriteLine(dr[0, DataRowVersion.Original]); } catch (Exception e) { Console.WriteLine("03:" + e.Message); } // dr.AcceptChanges(); //sda.Update(ds,"Table_1"); } else { Console.WriteLine("newDS has Error"); } } else { Console.WriteLine("newDS has no changes"); } if (sc.State == ConnectionState.Open) sc.Close(); sc = null; Console.WriteLine("Update was processed successfulle?"); Console.ReadLine(); } } } |
過去のメモを登録していくつもりがなかなか登録に手間取り古い情報ばかりになってしまっていますのでご利用の際はご注意を
最近のコメント