2012-04-14 11 views
0

私はWebフォームを持っています。データベーステーブルの列に対応する20のフィールドがあります。 BIRTHDATE列のレコードが1つあり、その値を2000年7月13日から12月FEB-1985に変更したとしましょう。しかし、私はcolumsnの残りの部分に触れません。私はそれが資源の無駄だと思うC# - 更新されたばかりの列の更新

UPDATE TABLE1 SET COLUMN1=NEWVALUE1, COLUMN2=NEWVALUE2,......,BIRTHDATE=NEWVALU 

UPDATE TABLE1 SET BIRHDATE=NEWVALUE WHERE ID=1111 

の代わりに、次のように行のすべての列を更新する:あなたはこのような更新ステートメントを実行するためにC#での方法です。私が間違っている?私はDataAdaptersがこの目的のためだとは思いますが、私はよく分かりません。

+0

あなたはEntity Frameworkを使用していますか? – sarwar026

+0

いいえ私はODP.NET(Oracle.Access.Dll)を使用します –

答えて

2

このようにして、直接更新文をOracleエンジンに送信できます。

using (OracleConnection cnn = new OracleConnection(connString)) 
using (OracleCommand cmd = new OracleCommand("UPDATE TABLE1 SET BIRHDATE=:NewDate WHERE ID=:ID", cnn)) 
{ 
     cmd.Parameters.AddWithValue(":NewDate", YourDateTimeValue); 
     cmd.Parameters.AddWithValue(":ID", 111); 
     cnn.Open(); 
     cmd.ExecuteNonQuery(); 
} 

EDIT:(?データテーブル、データセット)

あなたは、あなたが、元のデータソースを維持する必要が変更されている(およびORMツールを使用しない)どの分野がわからない場合最初にフィールドに値を設定します。その後、関連する行を更新し、OracleDataAdapterを使用します。

using(OracleConnection cnn = new OracleConnection(connString)) 
using (OracleCommand cmd = new OracleCommand("SELECT * FROM TABLE1 WHERE 1=0", cnn)) 
{ 
    OracleAdapter adp = new OracleDataAdapter(); 
    adp.SelectCommand = cmd; 
    // The OracleDataAdapter will build the required string for the update command 
    // and will act on the rows inside the datatable who have the 
    // RowState = RowState.Changed Or Inserted Or Deleted 
    adp.Update(yourDataTable); 
} 

このアプローチは、データベースに2回トリップする必要があるため、非効率的であることに注意してください。最初にテーブル構造を発見し、2番目の行を更新しました。さらに、OracleDataAdapterがUpdateCommand/InsertCommand/DeleteCommandを準備するためには、表に主キーが必要です。

これに対して、更新する行が多数ある場合は、これが便利です。

最後の代替(おそらく最も速い)はStoredProcedureですが、この場合、最初の例に戻ってStoredProcedureを使用するようにOracleCommandを調整する必要があります(すべてのフィールドをパラメータとして追加し、CommandTypeをCommandTypeに変更します) StoredProcedureコマンドのテキストをStoredProcedureの名前に変更します)。次に、StoredProcedureは、更新が必要なフィールドを選択します。

+0

そして、どのフィールドが変更されたのかを知りたいのですが? BIRTHDATEは単なる例です。 20個のフィールドのどれでも更新できます。 –

+0

それは私が必要なものです。したがって、列を1つだけ更新してすべての列の値をストアドプロシージャに送信すると、プロシージャ自体が、渡された列の値のうち、元のものと異なるものを判断し、正しいもののみを更新します。したがって、変更された列のみを更新するのはSQLデータベースの機能ですか? –

+1

データベースにデータフィールドが変更されていないときに書き込みを最適化するための内部メソッドがあるかどうかわかりません。しかし、私はこれについて心配しません。なぜなら、どのような方法が使われても、あなたと私が書くことができるコードよりも常に速くなるからです。もちろん、私はあなたがOracleのソフトウェア開発者ではないと思います:) – Steve

関連する問題