Получить ключ новой вставленной строки с помощью TableAdapter - PullRequest
0 голосов
/ 30 июня 2018

Я использую TableAdapter для вставки новой строки в таблицу. Вопрос в том, как получить ключ из таблицы вновь вставленной строки? Я немного искал и нашел пару решений:

  1. Используйте Max () - это широко считается ужасной идеей.
  2. Добавьте SELECT SCOPE_IDENTITY () к запросу. Когда я делаю это, я получаю ошибки в SqlBuilder. Когда я пробую это решение, я получаю:

Должен объявить скалярную переменную @FileName FileName - это первое поле в моем запросе:

INSERT INTO FileTable
                         (FileName, DirectoryName, FullPath, Extension, ToolNumber)
VALUES        (@FileName,@DirectoryName,@FullPath,@Extension,@ToolNumber);
SELECT SCOPE_IDENTITY();

Мой код VB.Net:

Dim fileRow As ToolsDataSet.FileTableRow
fileRow = ToolsDataSet.FileTable.NewRow()

With fileRow
    .FileName = "Test13456789"
End With

ToolsDataSet.FileTable.Rows.Add(fileRow)
FileTableTableAdapter.Update(fileRow)

Это похоже на общую потребность.

Как мне получить этот Ключ?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

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

Так что достаточно проверить значение столбца идентичности после обновления:

ToolsDataSet.FileTable.Rows.Add(fileRow)
Dim id = fileRow.Id
0 голосов
/ 01 июля 2018

С Typed DataTable, который ограничен одной таблицей (т. Е. SELECT * FROM FileTable), Typed DataTable способен замечать IDENTITY COLUMN и заполнять его после того, как вставка произойдет, предоставляя вам доступ к нему в вашем коде.

Таблица испытаний MSSql

CREATE TABLE [dbo].[Insert_Test](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [aString] [varchar](50) NULL,
    [aNumber] [int] NULL,
    [aBit] [bit] NULL,
    [aDate] [datetime] NULL,
    [aFloat] [float] NULL,
    [aImage] [varbinary](2048) NULL,
 CONSTRAINT [PK_Insert_Test] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Метод тестирования VB.Net

<TestMethod()>
Public Sub TestAddRowWithDataAdapter()
    Dim connectionString As String = "Server=.;Database=JVTest;Trusted_Connection=True;"
    Using conn As New SqlConnection(connectionString)
        conn.Open()

        Dim dataAdapter As New JVTestDataSetTableAdapters.Insert_TestTableAdapter()

        Dim dt As New JVTestDataSet.Insert_TestDataTable
        dataAdapter.Fill(dt)

        Debug.Print(dt.Rows.Count)

        Dim newRow As JVTestDataSet.Insert_TestRow
        newRow = dt.NewInsert_TestRow()
        dt.Rows.Add(newRow)

        newRow("aString") = "abc"
        newRow("aNumber") = 123
        newRow("aDate") = DateTime.Now

        Dim rowsInserted As Integer = dataAdapter.Update(newRow)

        Dim rowId As Integer = newRow.Id

    End Using
End Sub

Когда приведенная ниже строка выполняет, она возвращает 1, соответствующую одной добавляемой строке

Dim rowsInserted As Integer = dataAdapter.Update(newRow)

Когда строка ниже выполняется, столбец .Id содержит новые строки Id

Dim rowId As Integer = newRow.Id
...