0

次のようなストアドプロシージャがあります。

CREATE PROCEDURE procTest 
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
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 tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())
END
GO

のIDを返す必要がありますがtblSiteChallengeMember、その方法がわかりません。

私はここで例を見てきましたが、私はそれを恐れています:

SELECT TOP 1 @ProductName=PRODUCTNAME, @Quantity =quantity 
FROM Products P, [Order Details] OD, Orders O, Customers C 
WHERE C.CustomerID = @CustomerID 
AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID

1人のユーザーが複数回入力する可能性があり、それらの時間はまったく一意ではない可能性があるため、機能しません。

ASP.netページに挿入された最後の行のIDを取得するにはどうすればよいですか?


ストアドプロシージャを次のように更新しました。

ALTER PROCEDURE [dbo].[procCreateChallengeMember]
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
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 tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())

    SELECT @id = SCOPE_IDENTITY()
END

SQLテーブルは次のとおりです。

GO

/****** Object:  Table [dbo].[tblSiteChallengeMember]    Script Date: 10/17/2012 08:05:12 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblSiteChallengeMember](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [gameId] [int] NULL,
    [creatorId] [int] NOT NULL,
    [mediatorId] [int] NULL,
    [completed] [tinyint] NULL,
    [dateAdded] [datetime] NULL,
 CONSTRAINT [PK__tblSiteD__3213E83F628FA481] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

aspx.csは次のとおりです。

SqlConnection db = DataConn.SqlConnection();

db.Open();
SqlTransaction transaction = db.BeginTransaction();

try
{
    int id = 0;

    SqlCommand sqlComm =
            new SqlCommand(
                "procCreateChallengeMember @gameId, @creatorId, @mediatorId, @id", db, transaction) { CommandType = CommandType.Text };

    sqlComm.Parameters.Add(new SqlParameter("@gameId", SqlDbType.Int)).Value = 1;
    sqlComm.Parameters.Add(new SqlParameter("@creatorId", SqlDbType.Int)).Value = 1;
    sqlComm.Parameters.Add(new SqlParameter("@mediatorId", SqlDbType.Int)).Value = 1;
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int)
        {
            Direction = ParameterDirection.Output
        };

    sqlComm.Parameters.Add(param);
    sqlComm.ExecuteNonQuery();

    //if(param.Value != DBNull.Value)
    //{
        id = Convert.ToInt32(param.Value);
        Response.Write("One: " + id + "<br/>");
    //}
    transaction.Commit();
    //Response.Write("Two: " + sqlComm.Parameters["expr"].Value + "<br/>");

}
catch (Exception ess)
{
    transaction.Rollback();
    Response.Write(ess.Message);
}

エラー オブジェクトを取得すると、DBNullから他のタイプにキャストできなくなります。(そのIFステートメントを削除すると)

4

4 に答える 4

2

「ASP.net ページに挿入された最後の行の ID を取得するにはどうすればよいですか?」

SELECT @id = SCOPE_IDENTITY()

行を挿入して返すストアド プロシージャを取得します。

編集

フォローアップ問題への対応。

パラメータが途方に暮れていることを SqlCommand に認識させる必要があります。

   // Just below where you added your other params
   SqlParameter outputParam = new SqlParameter("@id", SqlDbType.Int)
   { 
      Direction = ParameterDirection.Output 
   };

   sqlComm.Parameters.Add(outputParam);

   sqlComm.ExecuteNonQuery();
于 2012-10-16T13:25:33.323 に答える
0

最後に、自分で解決策を見つけました(それはうまくいきます)。

SQL:

-- =============================================
-- Author:      Darren Whitfield
-- Create date: 7 October 2012
-- Description: This will create a new challenge holder, and return its ID
-- =============================================
ALTER PROCEDURE [dbo].[procCreateChallengeMember]
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
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 tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())

    SET @id = @@IDENTITY
    SELECT @id AS iden
END

aspx.cs:

string identity = "";
        SqlConnection db = DataConn.SqlConnection();

        db.Open();
        SqlTransaction transaction = db.BeginTransaction();

        try
        {

            SqlCommand sqlComm =
                    new SqlCommand(
                        "procCreateChallengeMember @gameId, @creatorId, @mediatorId, @id", db, transaction) { CommandType = CommandType.Text };

            sqlComm.Parameters.Add(new SqlParameter("@gameId", SqlDbType.Int)).Value = 2;
            sqlComm.Parameters.Add(new SqlParameter("@creatorId", SqlDbType.Int)).Value = 1;
            sqlComm.Parameters.Add(new SqlParameter("@mediatorId", SqlDbType.Int)).Value = 1;
            sqlComm.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Direction = ParameterDirection.Output });

            using (SqlDataReader rdr = sqlComm.ExecuteReader())
            {
                while (rdr.Read())
                {
                    identity = rdr["iden"].ToString();
                }
            }

            Response.Write("One: " + identity + "<br/>");

            transaction.Commit();

        }
        catch (Exception ess)
        {
            transaction.Rollback();
            Response.Write(ess.Message);
        }

返品 ID
時間を割いて考えや意見を述べてくれたすべての人に感謝します。それがなければ、私は決してそれを成し遂げなかったでしょう。

于 2012-10-17T06:40:09.480 に答える
0

SCOPE_IDENTITYPROCで使用した後に C# から取得する

SqlParameter param = new SqlParameter("@Id", SqlType.Int);
param.Direction = ParameterDirection.Output;

command.Parameters.Add(param);
command.ExecuteNonQuery();

int id = 0;
if(param.Value != null)
   id = Convert.ToInt32(param.Value)
于 2012-10-16T13:47:14.413 に答える
0
IF (@@error <> 1)
    BEGIN
    SELECT @id=scope_identity()
    END
ELSE
    BEGIN
    set @id=0
    RETURN 0 
    END
于 2012-10-16T13:31:20.640 に答える