我正在尝试完成一个看似简单的任务,但它已经变成了几个小时的冒险:从 @@Identity 获取 TableAdapter.Insert()

这是我的代码:

protected void submitBtn_Click(object sender, EventArgs e)
{
    AssetsDataSetTableAdapters.SitesTableAdapter sta = new AssetsDataSetTableAdapters.SitesTableAdapter();
    int insertedID = sta.Insert(siteTxt.Text,descTxt.Text);

    AssetsDataSetTableAdapters.NotesTableAdapter nta = new AssetsDataSetTableAdapters.NotesTableAdapter();
    nta.Insert(notesTxt.Text, insertedID, null,null,null,null,null,null);
    Response.Redirect("~/Default.aspx");
}

一个 answer 建议我可能要做的就是更改 ExecuteMode 。我试过了。这使得 GetData() 停止工作(因为我现在返回的是标量而不是 rowdata)(我需要保留 GetData())。它也没有解决 insertID 变量仍然设置为 1 的问题。

我尝试在 TableAdapter 中创建第二个 TypedDataSet.XSD 并将该适配器的属性设置为“标量”,但它仍然失败,变量的值为 1。

生成的插入命令是
INSERT INTO [dbo].[Sites] ([Name], [Description]) VALUES (@Name, @Description);
SELECT Id, Name, Description FROM Sites WHERE (Id = SCOPE_IDENTITY())

并且还设置了“刷新数据表”(在插入和更新语句后添加选择语句以检索标识)。

环境

SQL Server 2008 R2、Visual Studio 2010、.NET 4、Windows XP,所有本地机器。

这是什么原因造成的?

编辑/更新

我想澄清一下,我在 Visual Studio 中使用自动生成的代码。我不知道生成代码的“工具”是什么,但是如果您双击 *.XSD 文件,它会显示 SQL 表架构和关联 TableAdapter 的 UI。我想继续使用自动生成的代码并以某种方式启用获取身份。我不想用存储过程手工编写这一切。

最佳答案

这是我的 SQL 代码。

CREATE PROCEDURE [dbo].[Branch_Insert]
(
    @UserId uniqueidentifier,
    @OrganisationId int,
    @InsertedID int OUTPUT
)
AS
    SET NOCOUNT OFF;
INSERT INTO [Branch] ([UserId], [OrganisationId])
VALUES (@UserId, @OrganisationId);

SELECT Id, UserId, OrganisationId FROM Branch WHERE (Id = SCOPE_IDENTITY())
SELECT @InsertedID = SCOPE_IDENTITY()

然后当我创建表适配器时 - 我可以立即看到 @InsertedID 参数。

然后从代码中,我所做的就是:
int? insertedId = 0;
branchTA.Insert(userId, orgId, ref insertedId);

我不是 100% 使用 ref 是否是最好的选择,但这对我有用。

祝你好运。

关于c# - 从 TableAdapter 获取 @@IDENTITY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3704394/

10-09 12:51