Csharp/C#教程:从TableAdapter获取@@ IDENTITY分享


从TableAdapter获取@@ IDENTITY

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

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

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

生成的insert命令是

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

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

环境

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

是什么导致了这个?

编辑/ UPDATE

我想澄清我在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是最好的选择,但这对我有用。

祝好运。

真正的答案:

从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 { //... } 

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

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

笔记:

所有的信息都在这里,但我没有找到任何单一的答案,所以这里是我使用的完整步骤。

添加一个插入查询,并向其附加SELECT SCOPE_IDENTITY() ,如下所示:

 INSERT INTO foo(bar) VALUES(@bar); SELECT SCOPE_IDENTITY() 

确保你添加一个; 到VS为您创建的INSERT语句的末尾。

完成添加查询向导后,请确保在设计视图中选择了查询,然后从属性窗格中将“执行模式”更改为“ Scalar ”。

从代码中调用查询时,请确保使用Convert.ToInt32(),如下所示:

 id = Convert.ToInt32( dataTableAdapter.myInsertQuery("bar") ) 

没有Convert.ToInt32,您将不会遇到编译器错误,但是您将得到错误的返回值。

此外,每次修改查询时,都必须将执行模式重置为Scalar ,因为VS每次都会将其更改回Non Query

这是你如何做到的(在可视化设计器中)

  1. 右键单击表适配器并“添加查询”
  2. SQL语句 – 选择更新(最佳自动生成参数)
  3. 复制并粘贴您的SQL,它可以是多行的, 只需确保“查询设计器”不会打开 ,因为它将无法解释多个命令 – 我的示例显示了一个示例“合并”集语句(请注意,新的SERVERS具有Merge命令)。

     UPDATE YOURTABLE SET YourTable_Column1 = @YourTable_Column1, YourTable_Column2 = @YourTableColumn2 WHERE (YourTable_ID = @YourTable_ID) IF @@ROWCOUNT=0 INSERT INTO YOURTABLE ([YourTable_Column1], [YourTable_Column2]) VALUES (@YourTable_Column1, @YourTable_Column2) @YourTable_ID = SCOPE_IDENTITY() 
  4. 从查询属性窗口/侧栏更改/添加@YourTable_ID参数。 在参数集合编辑器中,ID参数需要具有InputOutput方向,以便在调用表适配器函数时更新该值。 (特别说明:确保您使InputOutput的任何列设计者没有将此列作为“只读”并且数据类型也匹配,否则更改数据表中的列或相应的参数信息)

这样可以节省为这种简单活动编写存储过程的需要。

太哇了。 您会注意到这种方法是一种快速执行数据层function的方法,而不必闯入SQL过程并编写大量的过程。 唯一的问题,你必须做很多跳舞……

您需要设置插入以将标识作为输出值返回,然后将其作为适配器中的参数获取。

这两个链接应该让你去:

https://www.akadia.com/services/dotnet_autoincrement.html

https://msdn.microsoft.com/en-us/library/ks9f57t0.aspx

你有两个选择:

我将使用以下SQL和ExecuteScalar。

 INSERT INTO [dbo].[Sites] ([Name], [Description]) OUTPUT INSERTED.ID VALUES (@Name, @Description); 

一种方法是在insert命令后运行select查询。 一个好方法是包装原始命令,如下所示:

上述就是C#学习教程:从TableAdapter获取@@ IDENTITY分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

  public int WrapInsert(Parameters) { ..... int RowsAffected = this.Insert(..Parameters..); if ( RowsAffected > 0) { try { SqlCommand cm = this.Connection.CreateCommand(); cm.CommandText = "SELECT @@IDENTITY"; identity = Convert.ToInt32(cm.ExecuteScalar()); } finally { .... } } return RowsAffected; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1016433.html

(0)
上一篇 2021年12月31日
下一篇 2021年12月31日

精彩推荐