2012-04-14 3 views
0

Ich habe ein Webformular. Es gibt 20 Dateien, die den Spalten in einer Datenbanktabelle entsprechen. Nehmen wir an, es gibt einen Datensatz, der eine BIRTHDATE-Spalte enthält, und ich ändere seinen Wert vom 13. Juli 2000 bis zum 12. Februar 1985. Aber ich berühre den Rest von columsn nicht. Ist dir einen Weg in C# eine Update-Anweisung wie folgt auszuführen:C# - Aktualisiere gerade aktualisierte Spalte (n)

UPDATE TABLE1 SET BIRHDATE=NEWVALUE WHERE ID=1111 

stattdessen alle Spalten der Zeile wie folgt zu aktualisieren:

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

Ich denke, es ist Verschwendung von Ressourcen wäre. Liege ich falsch? Ich denke DataAdapter sind für diesen Zweck aber ich bin mir nicht sicher.

+0

verwenden Sie Entity Framework? – sarwar026

+0

Nein Ich verwende ODP.NET (Oracle.Access.Dll) –

Antwort

2

Sie können auf diese Weise eine direkte Aktualisierungsanweisung an die Oracle Engine senden.

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: (eine Datentabelle, Datensatz)

Wenn Sie nicht wissen, welche Felder geändert (und wollen kein ORM-Tool verwenden), dann müssen Sie die ursprüngliche Datasource halten verwendet, um zunächst Ihre Felder zu füllen. Aktualisieren Sie dann die zugehörige Zeile und verwenden Sie einen 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); 
} 

Denken Sie daran, dass dieser Ansatz ineffizient ist, da zwei Fahrten zur Datenbank erforderlich sind. Der erste, um Ihre Tabellenstruktur zu entdecken, der zweite, um die geänderten Zeilen zu aktualisieren. Darüber hinaus benötigt der OracleDataAdapter zur Vorbereitung des UpdateCommand/InsertCommand/DeleteCommand einen Primärschlüssel in der Tabelle.

Im Gegensatz dazu ist dies praktisch, wenn Sie viele Zeilen aktualisieren müssen.

Die letzte Alternative (und wahrscheinlich die schnellste) ist ein StoredProcedure, aber in diesem Fall müssen Sie zu meinem ersten Beispiel zurückkehren und den OracleCommand so anpassen, dass er StoredProcedure verwendet (Alle Felder als Parameter hinzufügen, CommandType zu CommandType ändern) .StoredProcedure und ändern Sie den Text des Befehls als den Namen des StoredProcedure). Dann wählt der StoredProcedure, welche Felder aktualisiert werden müssen.

+0

Und wie werde ich wissen, welche Felder geändert wurde? GEBURTSTAG ist nur ein Beispiel. Jedes der 20 Felder kann aktualisiert werden. –

+0

OK, das habe ich gebraucht. Wenn ich also nur eine Spalte aktualisiere, aber alle Spaltenwerte an die gespeicherte Prozedur sende, wird die Prozedur selbst entscheiden, welche der übergebenen Spaltenwerte sich vom Original unterscheiden und nur diejenigen aktualisieren, die .Right? Also ist es die Fähigkeit der SQL-Datenbank, nur geänderte Spalten zu aktualisieren? –

+1

Ich weiß nicht, ob die Datenbank einige interne Methoden hat, um den Schreibvorgang zu optimieren, wenn sich ein Datenfeld nicht geändert hat. Aber ich werde mir darüber keine Sorgen machen, denn ich glaube, dass die Methode, die immer verwendet wird, immer schneller ist als der Code, den Sie und ich schreiben können. Natürlich sind Sie kein Softwareentwickler bei Oracle :) – Steve

Verwandte Themen