1

特定のユーザー数に達した後に無効にする必要があるボタン イベントがあります。

現在アクセスされているユーザー数を db に保存しています。ストアド プロシージャを作成しようとしています。ストアド プロシージャは、呼び出されると、そのテーブルのユーザー数を自動的に増やします。
減算する手順を別途作成します。

私の考えでは、現在の値を取得して 1 つ追加し、それをテーブルに保存して、次のコードを作成する必要があります。

CREATE PROCEDURE procDrRefBooksAddUser 
    -- Add the parameters for the stored procedure here
    @fileId int = NULL,
    @count int = 0,
    @newCount int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT UserCount FROM tblDrRefBooks WHERE DrRefBookFileID = @fileId
    SET @count = UserCount

    SET @newCount = @count + 1

    -- Insert statements for procedure here
    UPDATE tblDrRefBooks SET tblDrRefBooks.UserCount = @newCount WHERE DrRefBookFileID = @fileId
END

残念ながら、次のようなエラーが発生して、正しく処理できません。

Msg 207, Level 16, State 1, Procedure procDrRefBooksAddUser, Line 17
Invalid column name 'UserCount'

誰かが私が間違っているところを教えてください。

編集:回答の更新(最終的に)

私のSQLは:

ALTER PROCEDURE [dbo].[procDrRefBooksAddUser] 
    -- Add the parameters for the stored procedure here
    @fileId int = NULL,
    @newCount int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    -- SET NOCOUNT ON;

    UPDATE tblDrRefBooks
    SET @newCount = UserCount = UserCount + 1
    WHERE DrRefBookFileID = @fileId
    SELECT @newCount AS iden

END

コードビハインドは次のとおりです。

 using (SqlConnection db = DataConn.SqlConnection())
                {
                    db.Open();
                    SqlTransaction transaction = db.BeginTransaction();

                    try
                    {
                        lbltest.Text = "Starting...";
                       using (SqlCommand acommand =
                            new SqlCommand(
                                "EXEC procDrRefBooksAddUser @fileID, @count",
                                db, transaction) { CommandType = CommandType.Text })
                        {
                            acommand.Parameters.Add(new SqlParameter("@fileID", SqlDbType.Int)).Value = Int32.Parse(location.Value);
                            acommand.Parameters.Add(new SqlParameter("@count", SqlDbType.Int) { Direction = ParameterDirection.Output });

                            using (SqlDataReader rdr = acommand.ExecuteReader())
                            {
                                btnLoad.Text = "Here: " + rdr["iden"];
                            }
                        }

                        transaction.Commit();
                    }
                    catch (Exception ea)
                    {
                        transaction.Rollback();
                        lbltest.Text = ("Insertion Error: " + ea.Message);
                    }
                }

しかし、私はこのエラーが発生します:Insertion Error: Invalid attempt to read when no data is present.

4

4 に答える 4

2
SET @count = UserCount 

間違っています。SELECTそのような前のステートメントから列にアクセスすることはできません。

1 つのアトミック ステートメントですべてを実行できます。これにより、列がインクリメントされ、出力パラメーターが UserCount の新しい値に設定されます。

UPDATE tblDrRefBooks
SET    @newCount = UserCount = UserCount + 1
WHERE  DrRefBookFileID = @fileId 

これにより、別々の操作で値の読み取りと書き込みによる競合状態が回避されます。

于 2012-11-20T12:44:22.240 に答える
1

手順で以下のコードを使用します。

SELECT @count=UserCount FROM tblDrRefBooks WHERE DrRefBookFileID = @fileId

于 2012-11-20T12:49:08.080 に答える
1

参考例としては、このようにする必要があります

SELECT @Count = UserCount FROM tblDrRefBooks WHERE DrRefBookFileID = @fileId
@newCount = @Count + 1

しかし、あなたはそれを避けて、代わりにこれを行うことができます

UPDATE tblDrRefBooks SET UserCount = UserCount + 1
WHERE 
   DrRefBookFileID = @fileId AND
   UserCount < @MaxUserCount

アップデート

私が追加したことに注意してくださいAND UserCount < @MaxUserCount。ページがすぐに更新される [競合状態] ため、ストアド プロシージャはすべてのカウントをキャプチャしない場合があります。古い @Count 値を持っている可能性があります。

  • MAXに達していない場合にのみカウントが増加することを確認してください
  • 別の PROC を使用して、任意の時点でカウントを取得するだけです。古いカウント値を取得できるため、カウントの更新と同じ PROC で実行しないでください。
  • MAX に達すると、PROC で設定されるテーブルにフラグを設定できます
于 2012-11-20T12:46:41.997 に答える
0

一時変数を使用したり、selectクエリを使用したりする必要はありません。これを試して..

UPDATE tblDrRefBooks 
SET tblDrRefBooks.UserCount = UserCount +1 
WHERE DrRefBookFileID = @fileId
于 2012-11-21T07:30:02.343 に答える