2011-12-13 3 views
0

У меня возникли проблемы с попытками создания новых строк в SQL-сервере с типизированным адаптером данных, где первичный ключ устанавливаются в GUID и значение по умолчанию является NEWSEQUENTIALID()NEWSEQUENTIALID и напечатал DataAdapters

Колонка friendInviteID является GUID, и имеет значение по умолчанию (NEWSEQUENTIALID)

 Using myDT As New DAL.mbrFriendInvites.mbrFriendInvitesDataTable 
      Using myTA As New DAL.mbrFriendInvitesTableAdapters.mbrFriendInvitesTableAdapter 

       Dim row As DAL.mbrFriendInvites.mbrFriendInvitesRow = myDT.NewmbrFriendInvitesRow 
       With row 
        .friendInviteID = Nothing 
        .mbrID = 11 
        .appID = 2 
        .contactEmail = "[email protected]" 
        .contactName = "blah blah" 
        .timesSent = 0 
       End With 

       myDT.AddmbrFriendInvitesRow(row) 

       Dim result As Integer = myTA.Update(myDT) 
       HttpContext.Current.Response.Write("rows updated: " & result) 

      End Using 
     End Using 

Когда я вставить новую строку с помощью описанного выше способа, SQL Server устанавливает значение friendInviteID к: 00000000-0000-0000-0000-000000000000

Он, похоже, не хочет использовать e Значение по умолчанию NewSequentialID().

Я могу создать GUID вручную и вставить его таким образом, но это не создаст SequentialID.

Что мне не хватает?

+0

Где вы использовали скалярную функцию как значение по умолчанию, в SQL-Server или в типизированном DataSet? Если это действительно сильный типизированный DataSet, есть также автогенерированная функция 'brFriendInvitesRow.setfriendInviteIDNull()', которую вы должны использовать. –

+0

Он установлен в SQLServer как значение по умолчанию. Если я открою таблицу в студию управления сервером sql и вручную добавлю строку в таблицу, она автоматически добавит последовательный идентификатор - так что я знаю, что он работает на сервере sql. Нет setfriendInviteIDNull, потому что это первичный ключ и не может быть нулевым. –

+0

Если это не может быть «null» в вашем DataSet, следует создать исключение или объяснить, почему «ничего» не переводится в GUID по умолчанию. Вы должны попытаться разрешить null в DataAdapter. –

ответ

0

Меняйте TableAdapter-х InsertCommand так, что он создает GUID или вызывает любое скалярное оцененный UDF, которая возвращает его:

Click here for full-view

enter image description here

Если вы просто хотите создать GUID в SQL-сервере - вы могли бы также использовать newid():

INSERT INTO Test (idTest, Value, Test) 
VALUES (newid(),@Value,@Test); 

вы также может use a Stored-Procedure как CommandType InsertCommand, который выполняет все это и возвращает фактические значения через выходные параметры.

Я спрашивал себя недавно, как получить эти первичные ключи: Retrieve identity value from inserted record's primary key

Если вам нужно больше информации по этому вопросу, я посмотрю, как я реализовал его. В любом случае вам понадобится InputOutput как Direction для ваших параметров InsertCommand.

+0

. Я не люблю mofidy автогенерированных адаптеров - может быть настоящей болью, когда они перезаписываются кем-то другим. Думаю, я мог бы написать сохраненный proc, который возвращает новый secentialID, а затем использовать его при вставке строки. Кажется странным, что значение по умолчанию, похоже, не поддерживается для GUID. –

+0

Существует много вещей, которые не реализованы или плохо реализованы в типизированном DataSet. Есть причина быть устаревшим и больше не поддерживаться. Вам часто нужно обходиться.Вы видели, что я отредактировал свой ответ. Лучший способ (при использовании типизированных DataSets) в этом случае - использовать SP, который вставляет строку и возвращает все динамические значения. Но, на мой взгляд, «uniqueidentifier» - это плохой выбор для первичного ключа (как уже отмечал @gbn). –

+0

Я предполагаю, что уникальный идентификатор не может быть возвращен через 'SCOPE_IDENTITY', поэтому возвращаемое значение не может быть установлено. Возможно, это причина отправки '00000000-0000-0000-0000-000000000000' в базу данных. http://stackoverflow.com/a/1510529/284240 –