Возвращение уникального идентификатора из вставленной записи - PullRequest
0 голосов
/ 24 января 2019

Я разрабатываю приложение на C #, которое может переключаться между 2 базами данных - SQL-Server и локальной базой данных SQL-Compact.

При вставке чего-то я хочу вернуть вставленный идентификатор, который является uniqueidentifier.

ExecuteScalar() не работает для uniqueidentifier. Только при использовании output inserted.id.

Но output inserted.id не поддерживается SQL-Compact.

Есть ли способ получить uniqueidentifier в обеих базах данных?

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Невозможно сделать это с SQL Server Compact.

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

0 голосов
/ 24 января 2019

Лучше всего использовать @@IDENTITY в сочетании с оператором выбора.

Передать это как команду SQL:

  insert into myTable ( col1, col2, ...) values ( 'val1', 'val2', ...);SELECT @@IDENTITY;

По сути, это вставляет значение, а затем немедленно (в том же сеансе) запрашивает самое последнее созданное удостоверение, которое будет только что вставленным вами.

Затем в вашем коде: int iResult = (int)sqlCommand.ExecuteScalar()

0 голосов
/ 24 января 2019

Только что понял, что это дубликат ответа @Sean Langem. Я оставляю его, потому что он добавляет больше деталей, которые могут быть полезны для ОП.


Возможно, это не самое элегантное решение (то есть создание GUID в приложении), однако я считаю, что оно должно решить вашу проблему. Обратите внимание, что я проверял это только на SQL Server, а не на SQL Compact.

Используйте ExecuteScalar (), чтобы вернуть свой идентификатор, однако преобразуйте его в строку (varchar) в хранимой процедуре, а затем вернитесь к GUID в своем приложении.

Приведенный ниже пример очень прост для демонстрационных целей, а код находится на VB.Net и не обеспечивает закрытие соединения, обработку исключений и т. Д.

Пример хранимой процедуры, возвращающей значение UNIQUEIDENTIFER как VARCHAR:

CREATE PROCEDURE test
AS 

    DECLARE @id uniqueidentifier
    SET @id = NEWID()

    SELECT CONVERT(VARCHAR(38), @id)
GO

Пример кода .Net для вызова базы данных и получения строки, а затем преобразования в guid.

Sub main()

    Dim id As Guid
    Dim stringId As String

    Using con As New SqlConnection("Server=<server>;Database=<DB>;Trusted_Connection=True;")
        Using cmd As New SqlCommand("test", con)
            cmd.CommandType = Data.CommandType.StoredProcedure

            con.Open()
            stringId = cmd.ExecuteScalar()
        End Using
    End Using

    id = New Guid(stringId)

End Sub
0 голосов
/ 24 января 2019

Вот как вы можете сделать это, используя переменную.

declare @GUID uniqueidentifier = newid()

insert (YourColumns)
values(@GUID)

select convert(varchar(36), @GUID) as MyKey
...