SCOPE_INDENTITY()无效,是否返回null?

时间:2012-11-05 21:41:10

标签: c# .net sql c#-4.0 ado.net

阅读了这个网站我认为以下代码会返回我添加到我的数据库的项目的ID,但我想填写的int值没有显示在范围内。这是我的insert语句的代码:

  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 

我在这里做错了什么?

3 个答案:

答案 0 :(得分:4)

SCOPE_IDENTITY返回插入同一范围内的标识列的最后一个标识值。您需要使用ExecuteScalar代替ExecuteNonQuery来检索它:

首先将sql更改为:

  

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

然后你可以用这种方式检索id:

ID = (int)com.ExecuteScalar();

答案 1 :(得分:2)

  

我已经检查过调试时命令参数@ID是否存在   最新条目的ID。

这表示您当前使用的数据库代码运行正常。

  

调试时,Int ID不会出现在本地人身上,如果我看到它,   GET ...

这是你问题的根源。问题是您已将ID范围限定在

if (type == typeof(Weights))

块。在该块之外,标识符ID没有意义。

在此过程的范围顶部声明ID,您应该可以在Locals中看到它或添加Watch。

答案 2 :(得分: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();