从TableAdapter获取@@ IDENTITY

P.B*_*key 3 c# sql asp.net tableadapter

我正在努力完成一个看似简单的任务,这个任务已经变成了几个小时的冒险:@@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");
}
Run Code Online (Sandbox Code Playgroud)

一个答案表明,我可能要做的就是改变ExecuteMode.我试过了.这使得GetData()退出工作(因为我现在返回一个标量而不是rowdata)(我需要保留GetData()).它也没有解决insertID变量仍然设置为1的问题.

我试图创建第二个TableAdapterTypedDataSet.XSD和设置属性为适配器"标",但它仍然无法与变量中获得的值为1.

生成的insert命令是

INSERT INTO [dbo].[Sites] ([Name], [Description]) VALUES (@Name, @Description);
SELECT Id, Name, Description FROM Sites WHERE (Id = SCOPE_IDENTITY())
Run Code Online (Sandbox Code Playgroud)

并且还设置了"刷新数据表"(在Insert和Update语句之后添加select语句以检索Identity).

环境

SQL Server 2008 R2,Visual Studio 2010,.NET 4,Windows XP,所有本地同一台机器.

是什么导致了这个?

编辑/ UPDATE

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

Rem*_*mco 7

真正的答案:

  • 阅读下面的注释!

从tableadapter插入函数获取标识

我经常不断地对这个问题提出疑问,而且从来没有时间把它写下来.

好吧,问题是如下:你有主键的表,int类型定义为Identity,插入后你需要知道新插入的行的PK值.完成此操作的步骤如下:

使用向导在查询体中添加新的插入查询(让我们称之为InsertQuery)只需在保存此查询后在底部添加SELECT SCOPE_IDENTITY(),将此查询的ExecuteMode属性从NonQuery更改为Scalar,在代码中写入以下(ta为TableAdapter实例):

int id;

try
{
 id = Convert.toInt32(ta.InsertQuery(firstName, lastName, description));
}
catch (SQLException ex)
{
//...
}
finally
{
//...
}
Run Code Online (Sandbox Code Playgroud)

用这个赚钱!:)由DraškoSarić于2009年3月12日发布

来自:http: //quickdeveloperstips.blogspot.nl/2009/03/get-identity-from-tableadapter-insert.html

笔记:

  • 可以通过生成的插入查询的属性将ExecutMode设置为Scalar.(按F4).

  • 在我的版本(Visual Studio 2010 SP1)中,select语句是自动生成的.