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并将其放在局部变量中?
提前多多感谢, 阿德里安
答案 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在评论中已经提到的那样),以及不是@@IDENTITY
或IDENT_CURRENT
。
@@IDENTITY
可能不起作用,因为it will return the identity from the last insert that happened from your connection。因此,如果您的QuizTable
上有一个触发器在另一个具有标识列的表中插入一行,@@IDENTITY
将返回该第二个插入的值,而不是原始插入的值QuizTable
。
IDENT_CURRENT
将返回表格的最后一个标识值(并且仅针对您的表格,因此如果存在类似上一示例中的触发器,则无关紧要。)
但它返回任何会话的最后一个标识值。因此,如果您的INSERT
与IDENT_CURRENT
之间的另一个会话插入了另一行,you'll get the identity value from that row, not from yours.