我的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
答案 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);