Обновление базы данных C # - PullRequest
0 голосов
/ 12 апреля 2011

Я застрял на небольшой проблеме с базой данных.

Раз в месяц я получаю XML-файл с информацией о клиенте (имя, адрес, город и т. Д.). Мой первичный ключ - это номер клиента, который указан в файле XML.

У меня нет проблем с вставкой информации в базу данных;

var cmd = new SqlCommand("insert into [customer_info] 
   (customer_nr, firstname, lastname, address_1, address_2, address_3.......)");
//some code
cmd.ExecuteNonQuery();

Теперь я хотел бы обновить свою таблицу или просто заполнить ее новой информацией. Как мне этого добиться?

Я пытался использовать TableAdapter, но это не работает.

И мне разрешено добавлять только один XML, потому что у меня может быть только один customer_nr в качестве первичного ключа.

Так в принципе, как мне обновить или заполнить мою таблицу новой информацией?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

Одним из способов будет массовая вставка данных в новую промежуточную таблицу в базе данных (для этого можно использовать SqlBulkCopy для оптимальной скорости вставки).Как только он там окажется, вы можете затем проиндексировать поле customer_nr и запустить 2 оператора:

-- UPDATE existing customers
UPDATE ci
SET ci.firstname = s.firstname,
    ci.lastname = s.lastname, 
    ... etc
FROM StagingTable s
    INNER JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr

-- INSERT new customers
INSERT Customer_Info (customer_nr, firstname, lastname, ....)
SELECT s.customer_nr, s.firstname, s.lastname, ....
FROM StagingTable s
    LEFT JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr
WHERE ci.customer_nr IS NULL

Наконец, удалить промежуточную таблицу.

В качестве альтернативы, вместо 2 операторов вы можетепросто используйте оператор MERGE , если вы используете SQL Server 2008 или более позднюю версию, что позволяет выполнять INSERT и UPDATE с помощью одного оператора.

2 голосов
/ 12 апреля 2011

Если я правильно понимаю ваш вопрос - если клиент уже существует, вы хотите обновить его информацию, а если он еще не существует, вы хотите вставить новую строку.

У меня много проблем с жестко запрограммированными командами SQL в вашем коде, поэтому я, во-первых, очень хотел бы реорганизовать то, что вы сделали. Однако для достижения того, что вы хотите, вам нужно будет выполнить SELECT для первичного ключа, если он возвращает какие-либо результаты, вы должны выполнить UPDATE, иначе вы должны выполнить INSERT.

Было бы лучше сделать это что-то вроде Stored Procedure - вы можете передать информацию в хранимую процедуру, после чего она может принять решение о том, UPDATE или INSERT - это также уменьшит накладные расходы на выполнение нескольких вызовов вашего кода в базу данных (хранимая процедура будет намного быстрее)

0 голосов
/ 12 апреля 2011

AdaTheDev действительно дал хорошее предложение.

Но в случае, если вы должны вставить / обновить код .NET, вы можете

  1. Создайте хранимую процедуру, которая будет обрабатывать вставку / обновление, т.е. вместо использования запроса прямой вставки в качестве текста команды, вы вызываете хранимую процедуру. SP проверит, существует строка или нет, а затем обновит (или вставит).
  2. User TableAdapter - но это было бы утомительно. Сначала вы должны настроить обе команды вставки и обновления. Затем необходимо выполнить запрос к базе данных, чтобы получить существующие номера клиентов, а затем обновить соответствующие строки в таблице данных, сделав Rowstate обновленным. Я бы предпочел не идти по этому пути.
...