执行insert语句并将id放在局部变量中?

时间:2012-04-28 06:20:56

标签: c# sql-server

SqlDataSource myQuiz = new SqlDataSource();

myQuiz.ConnectionString = ConfigurationManager.ConnectionStrings["yafnet"].ToString();
myQuiz.InsertCommand = "INSERT INTO [QuizTable]([Quiz_Title],[Quiz_Description]) VALUES (@Quiz_Title,@Quiz_Description)";

myQuiz.InsertParameters.Add("Quiz_Title",Quiz_Title.Text);
myQuiz.InsertParameters.Add("Quiz_Description",Quiz_Description.Text);

myQuiz.Insert();
Response.Redirect("QuizQuests.aspx");

有没有办法找回新行的自动生成的ID并将其放在局部变量中?

提前多多感谢, 阿德里安

3 个答案:

答案 0 :(得分:2)

使用

SELECT IDENT_CURRENT(‘QuizTable’)

它返回表中生成的最后一个IDENTITY值,无论创建该值的连接如何,也不管生成该值的语句的范围如何。 IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表格。 IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值。

答案 1 :(得分:1)

@Adrian De Barro:您可以使用以下代码获取插入的记录ID并保存在变量

在你的sqlquery中添加以下语句:

return @@IDENTITY

您的C#代码如下:

    SqlConnection cn = new   
    SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);        
    cn.Open();
    SqlCommand cmd = new SqlCommand(procname, cn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter str = new SqlParameter("name", SqlDbType.VarChar);
    str.Direction = ParameterDirection.ReturnValue;
    foreach (SqlParameter par in param)
    {
        cmd.Parameters.Add(par);
    }
    string name = Convert.ToString(cmd.ExecuteScalar());
    cmd.Dispose();
    cn.Close();
    return name;

答案 2 :(得分:1)

如果你想100%确定你真正从实际QuizTable中的插入中获得了身份,你应该使用SCOPE_IDENTITY()(正如Luiggi Mendoza在评论中已经提到的那样),以及不是@@IDENTITYIDENT_CURRENT

@@IDENTITY可能不起作用,因为it will return the identity from the last insert that happened from your connection。因此,如果您的QuizTable上有一个触发器在另一个具有标识列的表中插入一行,@@IDENTITY将返回该第二个插入的值,而不是原始插入的值QuizTable

IDENT_CURRENT将返回表格的最后一个标识值(并且仅针对您的表格,因此如果存在类似上一示例中的触发器,则无关紧要。)
但它返回任何会话的最后一个标识值。因此,如果您的INSERTIDENT_CURRENT之间的另一个会话插入了另一行,you'll get the identity value from that row, not from yours.