1
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 并将其放入局部变量中?

非常感谢,阿德里安

4

3 回答 3

2

采用

SELECT IDENT_CURRENT(‘QuizTable’)

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

于 2012-04-28T06:55:42.173 回答
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;
于 2012-04-28T07:09:16.533 回答
1

如果你想 100% 确定你真的从你的 insert 中获得了你的身份QuizTable,你应该使用SCOPE_IDENTITY()(正如 Luiggi Mendoza 在他的评论中已经提到的那样),而不是@@IDENTITYor IDENT_CURRENT

@@IDENTITY可能不起作用,因为它会从您的连接中发生的最后一次插入返回标识。因此,如果您的触发器QuizTable在另一个具有标识列的表中插入一行,@@IDENTITY则将返回第二个插入的值,而不是原始插入的值QuizTable

IDENT_CURRENT将返回您的表的最后一个标识值(并且仅适用于您的表,因此是否存在上一个示例中的触发器并不重要)。但它返回任何会话
的最后一个身份值。因此,如果从 your和 your之间的另一个会话中插入另一行,您将从行而不是您的行中获取标识值。INSERTIDENT_CURRENT

于 2012-04-28T15:51:56.633 回答