我正在尝试完成一个看似简单的任务,但它已经变成了几个小时的冒险:从 @@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/