Aktualisieren Sie Datensätze und fügen Sie sie in die Oracle-Tabelle ein, indem Sie OracleDataAdapter von DataTable verwC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Aktualisieren Sie Datensätze und fügen Sie sie in die Oracle-Tabelle ein, indem Sie OracleDataAdapter von DataTable verw

Post by Anonymous »

Eine Frage eines C#-Neulings und ich entschuldige mich für die Länge. Ich habe das folgende Szenario. Ich habe eine kleine Konsolenanwendung, die eine Datentabelle füllt, indem sie eine Verbindung zu einem externen System herstellt und dann vorhandene Datensätze aktualisieren und neue in eine Oracle-Tabelle einfügen muss. Die Spalten in der Datentabelle haben nicht denselben Namen wie die Spalten der Oracle-Tabelle und sind nicht in derselben Reihenfolge angeordnet. Ich habe hier einen anderen Beitrag mit einem ähnlichen Szenario (Laden aus einer Datei in eine Tabelle) gelesen und darin erwähnt, dass eine Aktualisierung/Einfügung mit einem OracleDataAdapter funktionieren würde. Eine vereinfachte Datentabelle und eine Oracle-Tabelle sind

Code: Select all

DataTable table = new DataTable();
table.Columns.Add("Product", typeof(String));
table.Columns.Add("Price", typeof(double));
table.Columns.Add("Effective_Date", typeof(DateTime));

Code: Select all

//sample data
table.Rows.Add("abcd", 1.011, DateTime.Today);
table.Rows.Add("efg", 1.00, DateTime.Today);
table.Rows.Add("hijk", 20, DateTime.Today);
Die Oracle-Tabelle hat die Struktur

Code: Select all

ITEM VARCHAR2(20 BYTE) NOT NULL ENABLE,
EFF_DATE DATE,
VALUE NUMBER
Ich habe den folgenden Code ausprobiert, um die Datentabelle und einen Adapter zum Aktualisieren der Oracle-Tabelle zu verwenden, aber mir fehlt etwas. Ich frage mich auch, ob ich auf dem falschen Weg bin. Bei den meisten Beispielen, die ich für die Verwendung eines Datenadapters gesehen habe, wird zunächst eine Auswahl aus der Tabelle durchgeführt und die Ergebnisse dann in ein Raster eingefügt, in dem ein Benutzer Datensätze hinzufügen, aktualisieren, einfügen oder löschen kann, und dann wird der Datenadapter zum Aktualisieren der Tabelle verwendet. In meinem Fall frage ich mich, ob ich es zum Laufen bekomme, wenn alle Datensätze in der Datentabelle sowieso als Einfügung behandelt werden, da keine Verbindung zwischen der Datentabelle und der Oracle-Tabelle besteht.

Ich verwende den Oracle.ManagedDataAccess.Client, um eine Verbindung herzustellen und die Aktualisierungen durchzuführen

Code: Select all

public static void UpdateOrSaveItems(DataTable dt)
{
String insert_statement, update_statement, select_statement;

select_statement = "SELECT * from items";
insert_statement = "INSERT INTO items (item, eff_date, value) values (:pInsItem,:pInsEffDate,:pInsValue)";
update_statement = "UPDATE items set eff_date = :pUpdEffDate, value = :pUpdValue where item = :pUpdItem";

using (OracleConnection conn = theDatabase.ConnectToDatabase())
{
using (OracleDataAdapter oraAdapter = new OracleDataAdapter(select_statement, conn))
{

//build update/insert commands and parameters
oraAdapter.UpdateCommand = new OracleCommand(update_statement, conn);
oraAdapter.InsertCommand = new OracleCommand(insert_statement, conn);

oraAdapter.UpdateCommand.BindByName = true;
oraAdapter.InsertCommand.BindByName = true;

OracleParameter pUpdItem = new OracleParameter("pUpdItem", OracleDbType.Varchar2);
pUpdItem.SourceColumn = dt.Columns[0].ColumnName;

OracleParameter pUpdEffDate = new OracleParameter("pUpdEffDate", OracleDbType.Date);
pUpdEffDate.SourceColumn = dt.Columns[2].ColumnName;

OracleParameter pUpdValue = new OracleParameter("pUpdValue", OracleDbType.Double);
pUpdValue.SourceColumn = dt.Columns[1].ColumnName;

OracleParameter pInsItem = new OracleParameter("pInsItem", OracleDbType.Varchar2);
pUpdItem.SourceColumn = dt.Columns[0].ColumnName;

OracleParameter pInsEffDate = new OracleParameter("pInsEffDate", OracleDbType.Date);
pInsEffDate.SourceColumn = dt.Columns[2].ColumnName;

OracleParameter pInsValue = new OracleParameter("pInsValue", OracleDbType.Double);
pInsValue.SourceColumn = dt.Columns[1].ColumnName;              oraAdapter.UpdateCommand.Parameters.Add(pUpdItem);

oraAdapter.UpdateCommand.Parameters.Add(pUpdEffDate);
oraAdapter.UpdateCommand.Parameters.Add(pUpdValue);

oraAdapter.InsertCommand.Parameters.Add(pInsItem);
oraAdapter.InsertCommand.Parameters.Add(pInsEffDate);
oraAdapter.InsertCommand.Parameters.Add(pInsValue);

oraAdapter.Update(dt);
}
}
}
Wenn ich dies ausführe, erhalte ich die Fehlermeldung, dass ich keine Null in eine Spalte einfügen kann, die als Schlüssel definiert ist. In der Datentabelle ist keines davon null. Mir fehlt etwas bei der Angabe, wo sich die Daten befinden, bin mir aber nicht sicher, um welche es sich handelt. Ich frage mich auch, ob dies der richtige Weg ist, so etwas zu tun. Ich wollte

vermeiden

Code: Select all

loop through datatable
select to see if record is in oracle table
if in table update else insert
weil das Volumen der Datensätze ein paar Hunderttausend betragen konnte und ich nicht sicher war, wie die Leistung aussehen würde.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post