Лучший способ управлять обновлением нескольких полей в строке таблицы для SQL Server 2005 с помощью C # - PullRequest
1 голос
/ 05 ноября 2011

У меня есть приложение, которое читает и пишет в таблицу в SQL Server 2005. Я знаю основы чтения и записи в таблицу.

Если идентификатора нет, я создаю новую запись. Если есть идентификатор, я обновляю существующую запись.

Как лучше всего написать строку SqlCommand, основываясь на том, существует ли она или является новой?

Я не вижу написания двух методов, когда требуется обновление двух мест, когда пришло время для изменений.

Любые советы или рекомендации будут оценены.

Ответы [ 3 ]

3 голосов
/ 05 ноября 2011

Вот полный пример рабочего кода, который вам нужен, все, что вам нужно сделать, это проверить, существует ли запись, затем обновить ее или просто вставить.

create table MyEntity(id int,val varchar(20))
Go
create proc SaveMyEntity(@id int, @val varchar(20))
as
If Exists (Select ID from MyEntity where Id = @ID)
Update MyEntity
       Set val = @val
       Where ID = @ID
else
Insert into MyEntity values(@ID,@val)

-- here is proof of insertion/updation

Go 
SaveMyEntity 1,'a'
Go
SaveMyEntity 1,'b'
Go
SaveMyEntity 2,'a'
Go
select * from myEntity

Результаты будут

 id val
1   b
2   a

Затем вы можете использовать этот сохраненный процесс из вашего SqlCommand в C # (рекомендуется)

Или вы можете просто использовать этот оператор SQL из вашего C # SqlCommand (не рекомендуется и не проверено)

If Exists (Select ID from MyEntity where Id = @ID)
Update MyEntity
       Set val = @val
       Where ID = @ID
else
Insert into MyEntity values(@ID,@val)
0 голосов
/ 05 ноября 2011

Похоже, вам может понадобиться оператор MERGE.

К сожалению, правильный оператор MERGE не поступил до SQL Server 2008. Однако его можно воспроизвести в 2005 году. Я нашел это очень быстро, и есть еще много примеров.

0 голосов
/ 05 ноября 2011

Я думаю, что вы должны работать с набором записей в ADO.Там вы можете открыть соединение, установить данные и затем сохранить их, тогда набор записей должен решить, нужно ли ему вставлять или обновлять.

Примерно так:

Set rs = CreateObject("ADODB.Recordset")
With rs
         Set .ActiveConnection = Application.GetNewConnection
         .CursorLocation = adUseClient
         .CursorType = adOpenStatic
         .LockType = adLockOptimistic
         .Open "select * from c_test where c_testid = '" & labelID.Caption & "'"

         If .RecordCount = 0 Then
            .AddNew
            .Fields("c_testid").Value = Application.BasicFunctions.GetIDFor("c_test")
            .Fields("accountid").Value = CurrentID
            .Fields("createuser").Value = Application.BasicFunctions.CurrentUserID
            .Fields("createdate").Value = Now
         End If

         .Fields("modifyuser").Value = Application.BasicFunctions.CurrentUserID
         .Fields("modifydate").Value = Now
         .Fields("field1").Value = edit1.Text
         .Fields("field2").Value = edit2.Text
         .Update

         .Close
End With
Set rs = Nothing

Взяты отсюда:http://www.slxdeveloper.com/page.aspx?action=viewarticle&articleid=76

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...