Обновите и вставьте записи в таблицу Oracle с помощью OracleDataAdapter из DataTable.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обновите и вставьте записи в таблицу Oracle с помощью OracleDataAdapter из DataTable.

Сообщение Anonymous »

Вопрос от новичка в C# и прошу прощения за его длину. У меня есть следующий сценарий. У меня есть небольшое консольное приложение, которое заполняет таблицу данных путем подключения к внешней системе, а затем ему необходимо обновить существующие записи и вставить новые в таблицу оракула. Столбцы в таблице данных называются не так, как столбцы таблицы Oracle, и не в том же порядке. Я прочитал здесь еще один пост с аналогичным сценарием (загрузка из файла в таблицу), и в нем упоминалось, что обновление/вставка с помощью OracleDataAdapter будет работать. Упрощенная таблица данных и таблица Oracle:

Код: Выделить всё

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

Код: Выделить всё

//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);
Таблица оракула имеет структуру

Код: Выделить всё

ITEM VARCHAR2(20 BYTE) NOT NULL ENABLE,
EFF_DATE DATE,
VALUE NUMBER
Я попробовал следующий код, чтобы использовать таблицу данных и адаптер для обновления таблицы Oracle, но мне что-то не хватает. Мне также интересно, не лаю ли я не на то дерево. Большинство примеров использования адаптера данных, которые я видел, сначала выполняют выборку из таблицы, а затем помещают результаты в сетку, где пользователь может добавлять, обновлять, вставлять или удалять записи, а затем использует адаптер данных для обновления стол. В моем случае мне интересно, заработает ли я, если все записи в таблице данных все равно будут рассматриваться как вставки, поскольку между таблицей данных и таблицей оракула нет связи.

Я использую Oracle.ManagedDataAccess.Client для подключения и выполнения обновлений

Код: Выделить всё

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);
}
}
}
Когда я запускаю это, я получаю сообщение об ошибке: я не могу вставить значение NULL в столбец, определенный как ключ. В таблице данных ни один из них не равен нулю. Мне что-то не хватает, когда я сообщаю, где находятся данные, но я не уверен, что это такое. Также интересно, правильно ли это делать. Я хотел избежать

Код: Выделить всё

loop through datatable
select to see if record is in oracle table
if in table update else insert
потому что объем записей мог быть пару сотен тысяч и не был уверен, какой будет производительность.

Подробнее здесь: https://stackoverflow.com/questions/230 ... om-datatab
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»