从生成的TableAdapter中获取范围标识

时间:2012-08-06 06:28:47

标签: sql-server visual-studio ado.net dataset identity-column

当我在Visual Studio中创建表适配器时,我可以单击高级选项并选择这些选项......

enter image description here

也许我的假设是错误的,但对我来说以某种方式检索该标识列值是有意义的。我查看了表适配器的自动生成的Insert()函数,它返回的整数是ExecuteNonQuery()的结果,它是受影响的行。

有人可以解释使用此复选框吗?我如何使用它来检索插入行的标识?

2 个答案:

答案 0 :(得分:0)

首先,该表需要数据库上的主键,否则不会生成更新命令,并且插入后不会刷新DataTable(如果密钥是由数据库生成的,例如自动增量)。 如果您没有主键并且想要检索db生成的值,请使用OUTPUT子句:

isnert into tablename(coulumnnames ..)OUTPUT inserted。* VALUES(values ...)

BR

答案 1 :(得分:0)

系统设计用于处理数据表,所以如果你想添加一行,一个方法是

  1. 创建临时数据表
  2. 使用该数据表的显式AddRow方法添加数据
  3. 使用表适配器更新新创建的数据表
  4. 返回表格第一行的ID字段。
  5. 第3步实际执行插入操作,然后在SCOPE_IDENTITY()上执行选择以刷新所有字段,包括“ID”列。

    来自WCF的工作示例:

    public string AddABCrecord(_ABCrecord ABC)
    {
        bool isValid = (ABC.Activity != null) && (ABC.Behaviour != null) && (ABC.Consequence != null);
    
        DS.__ABCrecordDataTable dt = new DS.__ABCrecordDataTable();
        dt.Add__ABCrecordRow(ABC.Session, ABC.Section, ABC.Video, ABC.Ordinal,
            ABC.Name, ABC.Date, ABC.Time, ABC.Location, ABC.Activity,
            ABC.Antecedent, ABC.Behaviour, ABC.Consequence,
            isValid);
    
        try
        {
            new ta__ABCrecord().Update(dt);
            return dt[0].ID.ToString();
        }
        catch (Exception e)
        {
            return "Error Adding ABC record\r\n" + e.Message + ((e.InnerException == null) ? "" : Environment.NewLine + e.InnerException.Message);
        }
    }