使用TableAdapter插入后返回了错误的ID

7

当我使用TableAdapter进行插入时:

int pid = this.purchaseTableAdapter.Insert(supplierid, datetime, "", 
    totalprice, amountpaid);

当它应该返回15时,它返回了错误的id 1

如何获得正确的ID?


请重新格式化您的问题,使其成为一个问题,并使其易读。 - Emond
现在是一个问题 :) - SMUsamaShah
4个回答

13

将执行模式属性设置为Scalar然后你可以获得ID,否则会返回受影响的行数。你需要在查询的属性窗口中设置该属性,而不是在查询向导中。

alt text

(图28)


1
请注意(正如文章中所提到的),您仍需要修改插入查询以使其返回所请求的标识。 - Emond

7

数据适配器返回受影响的行数而不是ID。


这并不是一个问题,这是设计上的考虑 :-) - tomfanning
这个“特性”应该有一个解决办法。 - SMUsamaShah
1
当插入多行时,Insert方法需要返回什么?该如何知道Insert方法中哪一列包含你要查找的id?换句话说,可以参考其他答案中的链接,看看其他人是如何处理这个问题的。 - Emond

1

1)存储过程:

您的存储过程主体必须类似于以下内容:

INSERT INTO MyTable (C1, C2, C3) VALUES (@c1, @c2, @c3);

SELECT SCOPE_IDENTITY();

重要的部分在于使用SELECT SCOPE_IDENTITY()而不是RETURN SCOPE_IDENTITY()。编辑:如果您调用的是函数而不是存储过程,则使用RETURN将起作用。
2) 表适配器:
右键单击您的表适配器,然后从上下文菜单中选择添加查询。 TableAdapter Query Configuration Wizard弹出:
- 选择命令类型:选择“使用现有存储过程”。 - 选择SP返回的数据形状:选择“单个值”。 - 为该方法输入一个适当的名称,例如InsertXYZ 3) 您的代码:
现在,当您在表适配器上调用方法InsertXYZ时,它将返回一个可以转换为Int32的对象。该值是新记录的ID!

1

我假设您有一个带有自动生成值的pid列。

回复此帖子中有答案。

select @@pid 

应该使用相同的开放连接。


pid 是具有自动增量值的 PurchaseId。 - SMUsamaShah
谈论生命的循环本质;我是写下那个回复的人。 - casperOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接