1

ビュー モデル内にベンダー オブジェクトがあります。このベンダー レコードをデータベースに挿入するときに、このベンダーの 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
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 プロシージャで最近追加されたアイテムの ID を返し、コマンドから同じ値を戻り値または出力パラメーターとして取得することです。

  • 返された値を使用し、次の操作で同じものを送信します。

しかし、私の専門家によると、これは良い選択肢ではありません。クエリの実行には依存関係があるため、トランザクションも実装する必要があります。

データベースレベルとアプリケーションレベルの両方で処理できます

シングル SP を使用して、両方のテーブルにトランザクションを使用してレコードを挿入するか、C# のアプリケーション レベルでトランザクション クラスを使用します。

これらがお役に立てば幸いです

于 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 に答える