【问题标题】:How to retrieve SQL identity using a TableAdapter Insert Command?如何使用 TableAdapter 插入命令检索 SQL 标识?
【发布时间】:2019-02-15 01:49:19
【问题描述】:

VS 2017 VB.NET 4.6.1

我使用标准向导和存储过程创建了一个数据源来获取数据。我已经编辑了数据源并使用存储过程添加了一个插入命令来执行插入。我想将存储过程生成的 Scope_Identity 返回给我的 VB 应用程序。

我已经使用参数集合编辑器和存储过程添加了一个额外的输出变量,但我没有任何运气。我不想对整个 tableadapter 进行编码,因为我有 71 个参数,而且我不喜欢将它们全部输入。

也许这是不可行的,但问一下也无妨。如果有人有一些信息或见解,我将不胜感激。

谢谢!

【问题讨论】:

  • 您不需要参数。您可以将新生成的 ID 选择回您插入的 DataRow 的 PK 列中。
  • @jmcilhinney 我试图理解你在说什么。当我从代码页运行插入时,它看起来像这样 - Me.ApGetSingleJobTableAdapter.Insert(71 parameters, some of them transformed from base data) 它不会返回任何我能看到的东西。不知道如何将 ID 选择回数据行,但我很想了解如何。谢谢!
  • 啊,如果您使用的是 DBDirect 方法,那么我的问题与此无关。它仅适用于调用Update。我们也不希望您发布带有 71 个参数的代码。我们想要一个MCVE

标签: vb.net


【解决方案1】:

好的,我得到了这个工作。

  1. 在我的插入存储过程中添加一个新参数:@job_order as int OUTPUT
  2. 在存储过程中,插入语句之后:SET @job_order = SCOPE_IDENTITY
  3. 在 vb.net 项目中编辑您的数据集,查看 TableAdapter 的属性并确保 GenerateDBDirectMethods 设置为 True
  4. 同样在 TableAdapter 属性中,单击 InsertCommand 上的下拉菜单并选择 New。
  5. 将 CommandType 更改为 StoredProcedure
  6. 单击 CommandText 的下拉菜单并选择您的存储过程
  7. 在 VS 2017 中存在参数列表不会从存储过程中填充的问题。要解决此问题,请添加 dbo。在 CommandText 字段中的过程名称之前。例如将 apAddJob 更改为 dbo.apAddJob。更改完成后,应填充参数列表。
  8. 打开 InsertCommand 的 Parameters 集合(现在应该有值),并验证您在第一步中添加的新参数不仅显示在列表中,而且具有 InputOutput 的方向。
  9. 在相关表单的代码页中,让自己成为一个模块级变量(在顶部,而不是在任何方法内),如下所示:Dim m_NewJobOrder As Integer
  10. 使用表适配器的插入命令执行插入,将新的模块级变量添加到末尾,如下所示: Me.ApGetSingleJobTableAdapter.Insert(txtbox1.text, txtbox2.text, (所有其他值), m_NewJobOrder)
  11. 标识值现在应该在插入后存储在 m_NewJobOrder 中。通常我用它来用新创建的记录重新填充数据集。

【讨论】:

    【解决方案2】:

    您应该能够通过将“额外输出变量”设置为等于 Scope_Identity() 来返回 Scope_Identity()

    例子:

    SET @ID = SCOPE_IDENTITY()

    这是另一个 Stack Overflow 讨论中的示例:

        CREATE PROCEDURE AddCategory
      -- Add the parameters for the stored procedure here
      @Category NVARCHAR(15),
      @CategoryID INT OUTPUT
    AS
    BEGIN
      SET NOCOUNT ON;
    
      -- Insert statements for procedure here
      INSERT INTO Categories (CategoryName) VALUES (@Category)
      SET @CategoryID = SCOPE_IDENTITY()
    END
    

    Fetch Scope_Identity

    【讨论】:

    • 非常感谢。您在上面显示的内容已在存储过程中到位,但我无法弄清楚如何配置 tableadapter insert 命令来捕获返回的值以及如何在它被捕获后访问它。对不起,我很感谢你的帮助。
    【解决方案3】:

    在插入查询的末尾添加行添加 Select SCOPE_IDENTITY()

    并将您的执行模式更改为标量而不是非查询。

    这是一个非常好的教程:

    Microsoft Docs Tutorial

    【讨论】:

    • 谢谢,但我没有对我在数据源编辑器中使用的表格适配器进行编码。我避免在代码中创建一个,因为我有 71 个不想手动创建的参数。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多