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返回插入到同一范围内的标识列中的最后一个标识值。您需要使用ExecuteScalar而不是ExecuteNonQuery检索它:

所以先把你的sql改成:

"插入到 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();

对于您的实际问题,请尝试在您的插入语句之后和 SET 之前放置一个分号。原因是因为你在同一个语句中。当 SCOPE_IDENTITY() 被调用时,还没有插入。您需要终止语句 ( ;) 然后调用SCOPE_IDENTITY();

于 2012-11-05T21:47:28.087 回答