如何在将数据插入表中时获取表生成的Id?

时间:2011-05-18 06:35:52

标签: c# asp.net wcf

这是我在DataAccess Layer中编写的函数,我也在使用WCF概念。 在这里我要在RequisitionTable中插入一些值,然后我将从该表返回的Id传递给另一个表..

在数据库表中,我将RequisitionID列指定为主键,并自动增加1。 在storedProcedure中,我将RequisitionID声明为@RequisitionID int OUT

public RequisitionDTO createRequisition(RequisitionDTO requisitionDTO)
{

Logging.logDebug("RequisitionDA: createRequisition initiated");
DataTable requisitionDataTable = new DataTable();
try
{
  Database dataBase = CommonDB.getApplicationDatabase();
  //Insert and Store Id into variable 'i'  
  int i= dataBase.ExecuteNonQuery("SP_requisitionInsert",
     requisitionDTO.FirstName, requisitionDTO.MiddleName,    
     requisitionDTO.LastName,requisitionDTO.Address);
  int RequisitionID = Convert.ToInt16(i);

}
catch(exception e)
{
  //
}

3 个答案:

答案 0 :(得分:2)

如果数据库引擎是SQL SERVER,则SCOPE_IDENTITY返回插入表中的最后一个标识值:

答案 1 :(得分:2)

我猜这是企业库数据访问应用程序块。

我无法在线查找Database.ExecuteNonQuery文档,但可以从我的离线帮助中找到:

  

使用给定的 parameterValues 执行 storedProcedureName 返回受影响的行数

(斜体原文,粗体加我)

我认为你需要使用其中一个明确提供命令对象的重载,你已经附加了显式参数对象,包括设置为输出的参数@RequisitionID

假设您的SP在返回之前正确地将SCOPE_IDENTITY()分配给此参数,正如其他人所建议的那样。


我还发现了一篇名为Executing a Command and Accessing Output Parameters的文章,该文章是作为企业库在线文档的一部分编写的,但您会注意到,与MSDN的其他部分不同,它不会链接到文档各个方法,也没有企业库的“参考”部分 - 它几乎就像他们不希望人们找到他们的文档。

答案 2 :(得分:0)

如果您使用的是sql server 2005或2008,请在存储过程中使用SCOPE_IDENTITY()