обновление базы данных С#

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

Раз в месяц я получаю 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 в качестве первичного ключа.

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

Спасибо.


person dumbel    schedule 12.04.2011    source источник


Ответы (3)


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

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

  1. Создайте хранимую процедуру, которая будет обрабатывать вставку/обновление, т. е. вместо использования прямого запроса на вставку в качестве текста команды вы делаете вызов хранимой процедуры. SP проверит, существует ли строка, а затем обновит (или вставит).
  2. User TableAdapter - но это было бы утомительно. Сначала вам нужно настроить команды вставки и обновления. Затем вам нужно запросить базу данных, чтобы получить существующие номера клиентов, а затем обновить соответствующие строки в таблице данных, сделав состояние строки обновленным. Я бы предпочел не идти по этому пути.
person VinayC    schedule 12.04.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

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

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

person AdaTheDev    schedule 12.04.2011

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

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

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

person trickdev    schedule 12.04.2011