SQL Server中的标识列暴露了奇怪的行为

时间:2014-05-15 19:58:46

标签: c# database sql-server-2008 dataset identity

我在SQL Server数据库的数据表中有一个identity(自动增量整数)列。

当我启动程序并向该表添加新记录时,标识列始终等于-1。对于下一个记录,它变为-2,依此类推。我用这种方式添加新记录:

http://msdn.microsoft.com/en-us/library/5ycd1034.aspx

然而,当我重新启动程序时,所有标识值都会重新排序(变为1,2,...)。

为什么会这样?如果我可以删除这些记录而不重新启动就没有问题。我使用SQL Server 2008.

还有什么方法可以通过GUI界面为列数据类型指定MAX大小(在visual studio 2012服务器资源管理器中添加表时)?

1 个答案:

答案 0 :(得分:2)

为什么他们是消极的我不知道。但是,当您重新加载应用程序时,这些记录已存在于数据库中,并具有在提交到数据库时分配的ID;这就是为什么他们在重启时有真正的价值。

但是,您不需要从DataTable删除记录,只需在将其提交到数据库后刷新该行。有很多方法可以做到这一点,并且在很大程度上取决于您现在如何访问数据,但是您可以使用SELECT SCOPE_IDENTITY()命令执行INSERT命令,然后执行使用ExecuteScalar提交行,如下所示:

var insertCmd = "INSERT INTO tbl (fld1, fld2) VALUES (@fld1, @fld2); SELECT SCOPE_IDENTITY()";

using (var c = new SqlConnection(connString))
using (var cmd = new SqlCommand(insertCmd, c))
{
    cmd.AddParameterWithValue("@fld1", fld1Value);
    cmd.AddParameterWithValue("@fld2", fld2Value);

    var result = cmd.ExecuteScalar();
    int id;
    if (int.TryParse(result, out id))
    {
        // update the DataTable row here
        dataTable.Rows[index]["id_column"] = id;
        dataTable.AcceptChanges();
    }
}

您甚至可以选择在执行更新后重新加载整个DataTable