首页 > 解决方案 > 使用 TableAdapter 获取新插入行的 Key

问题描述

我正在使用 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)

这似乎是一种普遍的需求。

我如何获得那个钥匙?

标签: vb.nettableadapter

解决方案


使用受限于单个表(即SELECT * FROM FileTable:)的 Typed DataTable,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

推荐阅读