1

このサイトを読んで、次のコードはデータベースに追加したアイテムのIDを返すと思いましたが、入力しようとしているint値がスコープに表示されません。これが私の挿入ステートメントのコードです:

  foreach (ExOb exc in exobject)
            {

                Type type = exc.GetType();
                //Add a weight exercise
                if (type == typeof(Weights))
                {

                    Weights thisweight = (Weights)exc;
                    string InsertWeight = ("INSERT INTO WeightExercise (ExcerciseName, Duration, Sets, DiaryId) VALUES (@name, @time, @sets, @DiaryId) SET @ID = SCOPE_IDENTITY();");

                        com = new SqlCommand(InsertWeight, con);
                        com.Parameters.AddWithValue("@name", thisweight.ExcerciseName);
                        com.Parameters.AddWithValue("@time", thisweight.WeightDuration);
                        com.Parameters.AddWithValue("@sets", thisweight.TotalSets);
                        com.Parameters.AddWithValue("@DiaryId", results[0]);
                        com.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
                        con.Open();
                        com.ExecuteNonQuery();
                        int ID = (int)com.Parameters["@ID"].Value;

                        con.Close();


                }
                else if (type == typeof(Cardio))
                {
                    Cardio thiscardio = (Cardio)exc;


                }

            }
        }

データベースは、ウェイトエクササイズの詳細で更新されます。デバッグ時に確認しましたが、コマンドパラメータ@IDは最新のエントリのIDを保持しています。Int IDは、デバッグ時にローカルに表示されません。それを見ると、次のようになります。

    ID  The name 'ID' does not exist in the current context 

私はここで何が間違っているのですか?

4

3 に答える 3

4

SCOPE_IDENTITY同じスコープ内の ID 列に最後に挿入された ID 値を返します。取得するExecuteScalar代わりに使用する必要があります。ExecuteNonQuery

したがって、最初にSQLを次のように変更します。

"INSERT INTO WeightExercise (ExcerciseName, Duration, Sets, DiaryId) VALUES (@name, @time, @sets, @DiaryId); SELECT SCOPE_IDENTITY();"

次に、次の方法で ID を取得できます。

ID = (int)com.ExecuteScalar();
于 2012-11-05T21:47:42.650 に答える
2

デバッグ時に確認したところ、コマンド パラメーター @ID に最新のエントリの ID が保持されています。

これは、現在使用しているデータベース コードが正常に機能していることを示しています。

デバッグ時に Int ID がローカルに表示されず、ウォッチすると...

これがあなたの質問の根源です。問題は、ID の範囲を

if (type == typeof(Weights))

ブロック。そのブロックの外では、識別子IDは意味を持ちません。

この手順のスコープの先頭で宣言IDすると、Locals で表示したり、Watch を追加したりできるはずです。

于 2012-11-05T21:48:59.713 に答える
0

テーブルに Identity 列があると仮定します。

これを試してください:

string InsertWeight = ("INSERT INTO WeightExercise 
(ExcerciseName, Duration, Sets, DiaryId) VALUES (@name, @time, @sets, @DiaryId); SELECT SCOPE_IDENTITY()");

次に、代わりに;をcom.ExecuteNonQuery()使用します。int ID = (int) com.ExecuteScalar()

実際の問題に対しては、insert ステートメントの後、SET の前にセミコロンを入れてみてください。その理由は、あなたが同じステートメントにいるからです。SCOPE_IDENTITY() が呼び出されたとき、まだ挿入されていません。ステートメント(;)を終了してから呼び出す必要がありますSCOPE_IDENTITY();

于 2012-11-05T21:47:28.087 に答える