.net 从插入的记录中检索标识值';s主键
我无法从DataRow中插入的记录(通过DataAdapter.Update)检索新标识值 我使用强类型数据集作为DAL。我要更新的表与SelectCommand中的其他表合并,因此设计器无法自动生成insert-/update-/delete命令,也无法自动“刷新数据表” 我尝试在主键的数据列上设置AutoIncrement=true/false,但结果是相同的:last MAX-ID+1而不是数据库生成的实际ID(SQL Server 2005 EP;pk datatype:int,is identity:yes,identity Increment:1) 如果应用程序的另一个实例插入了第一个实例还不知道的记录,并因此生成了一个已经存在的ID,则这将是错误的值f.e 要从db中检索新标识,我已将以下内容附加到insert命令的CommandText中:.net 从插入的记录中检索标识值';s主键,.net,asp.net,sql-server,ado.net,strongly-typed-dataset,.net,Asp.net,Sql Server,Ado.net,Strongly Typed Dataset,我无法从DataRow中插入的记录(通过DataAdapter.Update)检索新标识值 我使用强类型数据集作为DAL。我要更新的表与SelectCommand中的其他表合并,因此设计器无法自动生成insert-/update-/delete命令,也无法自动“刷新数据表” 我尝试在主键的数据列上设置AutoIncrement=true/false,但结果是相同的:last MAX-ID+1而不是数据库生成的实际ID(SQL Server 2005 EP;pk datatype:int,is i
;SELECT CAST (SCOPE_IDENTITY() AS int) AS newIdRMA
--Return the new id
SELECT SCOPE_IDENTITY()
我还尝试将输出参数添加到其参数集合中:
这是我更新数据库并设置新ID(无效)的代码的一部分:
编辑:
这是我的TableAdapter的InsertCommand及其参数集合的屏幕截图:
提前感谢。这里是我的操作方法:我将以下内容附加到我的insert命令的CommandText中:
;SELECT CAST (SCOPE_IDENTITY() AS int) AS newIdRMA
--Return the new id
SELECT SCOPE_IDENTITY()
然后我将该查询的“ExecuteMode”设置为“标量”而不是“非查询”
所以我可以用这种方式来检索:
newRMA = Me.dsRMA.RMA.AddRMARow()
我试试看。但是我应该在哪里将其从
非查询
更改为标量
,因为标准InsertCommand的属性没有公开此类属性(仅文本
、TableDirect
和存储过程
)?我现在尝试将InsertCommand更改为存储过程,并使用SCOPE\u IDENTITY
作为输出参数。但是在这里,如果可以的话,数据表是如何用新值重新构造的?第二:是否可以获取两个值作为输出,并用它们刷新数据行(ID和RMA_编号)?谢谢。您所指的属性值是命令类型,执行模式是我刚才添加的屏幕截图中显示的另一个属性。对于作为输出的2个值,我不喜欢这样做。我让数据库引擎生成ID,并在BLL中设置其他值,如RMA_编号。请注意,您还可以使用确保一块查询同时执行。我明白您的意思。但是如何配置TableAdapter以在更新时使用此查询?AddrRow当前是一个子行,不返回任何内容(我认为这是因为它的ExecuteMode是默认的NonQuery)。请看上面的图片。编辑(在您的第二条评论中):RMA_编号必须是唯一的,并且最好在SQL Server中生成。因此我希望它是一个输出参数。好的,我明白了,这是因为您使用InsertCommand而不是另一个查询。为此,我在表适配器上添加了一个单独的查询,然后在BLL中扭曲所有select insert和update查询,这与您正在做的不一样。为了保持RMA_编号的唯一性,如果在事务中使用insert查询扭曲检查最后一个RMA_编号的查询,则可以。同时,我觉得我的回答与问题无关。可能是重复的