我正在尝试完成一项看似简单的任务,但该任务已经变成了数小时的冒险:@@Identity从入门TableAdapter.Insert()。
@@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"); }
一个 答案 表明,我可能要做的就是更改ExecuteMode。我试过了 这使GetData()退出工作(因为我现在返回的是标量而不是rowdata)(我需要保留GetData())。它还不能解决该问题,因为insertID变量仍设置为1。
ExecuteMode
GetData()
我试图创建第二个TableAdapter在TypedDataSet.XSD和设置属性为适配器“标”,但它仍然无法与变量中获得的值为1。
TableAdapter
TypedDataSet.XSD
生成的插入命令是
INSERT INTO [dbo].[Sites] ([Name], [Description]) VALUES (@Name, @Description); SELECT Id, Name, Description FROM Sites WHERE (Id = SCOPE_IDENTITY())
并且还设置了“刷新数据表”(在Insert和Update语句之后添加一个select语句以检索标识)。
环境
SQL Server 2008 R2,Visual Studio 2010,.NET 4,Windows XP,所有本地同一台计算机。
是什么原因造成的?
编辑/更新
我想澄清一下,我在Visual Studio中使用自动生成的代码。我不知道生成代码的“工具”是什么,但是如果双击* .XSD文件,它将显示SQL Table Schema和关联的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是最好的选择,但这对我有用。
祝你好运。