【发布时间】:2011-04-11 21:20:17
【问题描述】:
我正在尝试完成一项看似简单的任务,却变成了几个小时的冒险:从TableAdapter.Insert() 获取@@Identity。
这是我的代码:
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() 退出工作(因为我现在返回一个标量而不是行数据)(我需要保留 GetData())。它也没有解决insertedID变量仍然设置为1的问题。
我尝试在 TypedDataSet.XSD 中创建第二个 TableAdapter 并将该适配器的属性设置为“标量”,但它仍然失败,变量的值为 1。
生成的插入命令是
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 表架构和关联的 TableAdapter 的 UI。我想继续使用自动生成的代码并以某种方式启用获取身份。我不想用存储过程手动编写这些。
【问题讨论】:
-
如果可能,请使用
SCOPE_IDENTITY()或IDENT_CURRENT(tablename)而不是@@IDENTITY。@@IDENTITY值可能不是您所期望的(它是在最后一个事务中涉及的任何表中生成的最后一个 IDENTITY,包括那些可能从触发器或类似的东西接收 INSERT 的表)。 -
只是对您的编辑的注释-自动生成的代码会根据您的存储过程中的变化进行检测-因此根据我下面的回答,您只需修改 2 行代码即可获得所需的效果。我认为没有其他办法。
标签: c# asp.net sql tableadapter