1

我的视图模型中有一个供应商对象。当我将此供应商记录插入数据库时​​,我想检索此供应商的 ID,因为它将在之后立即用作另一个表的外键(在不同的存储过程中)。我正在尝试使用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
4

3 回答 3

2

在插入语句之后的 SP 中。采用

Select @@IDENTITY As ReturnedId

在您的服务代码中,执行以下操作:

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

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

于 2013-03-08T13:09:30.737 回答
1

对此有解决方案,但您需要确保以下几点:-
您可以使用当前代码尝试@@Identity在 SQL 过程中返回最近添加的项目的标识,并从命令中获取与返回值或输出参数相同的信息。

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

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

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

使用 Single SP 在 C# 的应用程序级别使用 Transaction 或 Use Transaction 类在两个表中插入记录

希望这些会有所帮助

于 2013-03-08T13:12:47.260 回答
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);
于 2013-03-08T15:15:07.710 回答