我应该如何处理最近插入的记录ID的检索,以便它可以插入另一个表?

时间:2013-03-08 12:55:20

标签: c# asp.net sql asp.net-mvc

我的View模型中有一个Vendor对象。当我将此供应商记录插入数据库时​​,我想检索此供应商的ID,因为它将在另一个表之后立即用作外键(在不同的sproc中)。我正在尝试使用test作为我需要检索的ID。以下代码无效,因为proc_amcInsertApplicationServerRelationship需要一个整数,但test的类型为Object Parameter

我想我的问题是:

我接近这个吗?如果没有,那会是更好的方法吗?另外,根据我目前的方法,有什么简单的我忽略了我可以做到这一点吗?这是我的代码(对不起,如果我没有提供足够的细节):

    [HttpPost]
    public ActionResult Create(ApplicationViewModel applicationViewModel)
    {
        try
        {
            // TODO: Add insert logic here
            ObjectParameter test = new ObjectParameter("ID", typeof (int));
            var vendorID = db.proc_amcInsertNewVendor(applicationViewModel.Vendor.Company, applicationViewModel.Vendor.StreetAddress, applicationViewModel.Vendor.SecondaryStreetAddress,
                applicationViewModel.Vendor.City, applicationViewModel.Vendor.State, applicationViewModel.Vendor.ZipCode, applicationViewModel.Vendor.PhoneNumber,
                applicationViewModel.Vendor.Website, test);

            foreach (var serverID in applicationViewModel.ServerIDs)
            {
                db.proc_amcInsertApplicationServerRelationship(test, serverID);
            }

            return RedirectToAction("Index");
        }
        catch (Exception exception)
        {
            return View();
        }
    }

编辑:按请求,这是我的存储过程。

@Company varchar(100)
,@StreetAddress varchar(100)
,@SecondaryStreetAddress varchar(50)
,@City varchar(50)
,@State varchar(50)
,@ZipCode varchar(10)
,@PhoneNumber varchar(15)
,@Website varchar(200)

,@ID int = NULL OUT

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO [dbo].[amc_Vendors]
(
 [Company]
,[StreetAddress]
,[SecondaryStreetAddress]
,[City]
,[State]
,[ZipCode]
,[PhoneNumber]
,[Website]
)
VALUES
(
 @Company
,@StreetAddress
,@SecondaryStreetAddress
,@City
,@State
,@ZipCode
,@PhoneNumber
,@Website
)

SET @Id = SCOPE_IDENTITY()
END
GO

3 个答案:

答案 0 :(得分:2)

在插入语句后的SP中。使用

Select @@IDENTITY As ReturnedId

在您的服务代码中,执行:

int Id=db.proc_amcInsertApplicationServerRelationship(serverId).FirstOrDefault().ReturnedId;

使用此ID进行进一步处理。

答案 1 :(得分:1)

有解决方案,但您需要确保以下内容:
- 您可以尝试使用当前代码返回SQL程序中最近添加的项目@@Identity的身份,并从返回值或输出参数获取相同的命令。

  • 使用返回的值并在下一步操作中发送。

但就我的专业知识而言,这不是一个好选择。由于您具有查询执行的依赖项,因此您还需要实现Transaction。

您可以在数据库和应用程序级别处理它们

使用单个SP在两个表中使用Transaction或插入记录 在C#

中的应用程序级别使用Transaction类

希望这些会有所帮助

答案 2 :(得分:0)

遵循:

在你的SP中:

CREATE PROCEDURE dbo.YourSPName 
     @Param1 varchar(156),
    @Id Int OUTPUT
AS
SET NOCOUNT ON;

SELECT @Id = @@IDENTITY

在您的C#代码中:

 var outputParameter = new ObjectParameter("Id", typeof(int));

 context.YourSPName("ParamValue", outputParameter);

 Console.WriteLine(outputParameter.Value);