从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
。
这是你如何做到的(在可视化设计器中)
- 右键单击表适配器并“添加查询”
- SQL语句 – 选择更新(最佳自动生成参数)
-
复制并粘贴您的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()
-
从查询属性窗口/侧栏更改/添加@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