繁体   English   中英

如何更新数据表中的所有自动增量列?

[英]How to update all the autoincrement columns in a DataTable?

我有一个带有“ Id”列的数据表,该列是我们的SQL Server 2005数据库中的一个标识列。 此列的AutoIncrement属性设置为true。 我不使用数据库中的数据填充表,因为我仅将其用于插入,因此它将分配从1开始的虚假ID。

但是,在调用tableAdapter.Update()之后,我希望在该列中具有由数据库分配的REAL ID。

由于某些原因,只有第一行会更新,其余所有行都不会更新。 该表使用级联的DataRelation(层次结构)进行引用,并且对第一行的引用也进行了更新。

请告诉我如何更新所有ID。

提前致谢!

INSERT语句:

INSERT INTO Components (ComponentId, OrderNo, SerialNo) 
VALUES (@ComponentId, @OrderNo, @SerialNo) 

这是组件表的架构:

Id BIGINT PK, 
ComponentId BIGINT FK, 
OrderNo int, 
SerialNo int 

请注意,Id列的名称为“ Id”,“ ComponentId”为FK参考列。

这曾经很容易。 您只需将Column.AutoIncrementSeed和Column.AutoIncrementStep都设置为“ -1”。 这样,添加的新行的ID将为-1,-2,依此类推。 然后,您的存储过程或TSQL代码将简单地是:

UPDATE Table
SET 
    Col1 = @Col1
    Col2 = @Col2
WHERE (ID = @ID) -- If this is -1, -2, etc, it won't update

IF (@@ROWCOUNT = 0)
    BEGIN
    INSERT INTO Table(Col1, Col2) VALUES(Col1, Col2)
    SET @ID = SCOPE_IDENTITY();  -- @ID would now change from -1 to 1, 2, 3, etc.
END

但是,Microsoft用自己的无限智慧使这一切随着ADO.NET 4.0的改变而变得更糟。 我不确定它何时更改,但是它们现在在AutoIncrement列上具有一个基础私有字段,该字段在其中存储该列的当前值。 因此,假设在数据库中,最后插入的值为“ 52”,那么现在该值将隐藏在AutoIncrement列中。 这现在导致多用户应用程序出现巨大问题,由于它从最后一个AutoIncrement值开始倒数,所以我不再可以使用“ -1”把戏了。 我什至试图通过反思来改变这一点,但这没有好处。 我讨厌微软在ADO.NET中破坏了这一点,但他们坚持“不,我们不会修复bug X(不会真正影响任何用户)”的口号,但是我们将实施全新的解决方案您曾经使用过的所有代码”。

在执行Fill方法之前,请创建一个具有自动增量的数据列,

编辑:

    SqlConnection cn = new SqlConnection(@"Connection_String");
    SqlDataAdapter adp;
    SqlCommandBuilder cb;
    DataTable dt;

    private void Form3_Load(object sender, EventArgs e)
    {
        adp= new SqlDataAdapter("select * from temp", cn);
        cb = new SqlCommandBuilder(adp);
        dt = new DataTable();
        dt.Columns.Add("SrNo", typeof(int));
        dt.Columns[0].AutoIncrement = true;
        dt.Columns[0].AutoIncrementSeed = 1;
        dt.Columns[0].AutoIncrementStep = 1;

        adp.Fill(dt);
        dataGridView1.DataSource = dt;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        adp.Update(dt);
    }  

您必须从SQL返回身份。 但是我不确定确切的语法了

尝试

INSERT INTO Components (ComponentId, OrderNo, SerialNo) 
VALUES (@ComponentId, @OrderNo, @SerialNo);
SET @ComponentId = SCOPE_IDENTITY()

要么

INSERT INTO Components (ComponentId, OrderNo, SerialNo) 
VALUES (@ComponentId, @OrderNo, @SerialNo);
SELECT SCOPE_IDENTITY()

问题出在提到的DataRelation中。 由于某种原因,由于此DataRelation,尽管DataTable选中了“ Refresh the Data Table”(在“ Configure / Advanced Settings”(配置/高级设置)中),但未将“子”行插入数据库中,并且其ID也未更新为实际ID。 )。

我删除了DataRelation并手动完成了所有工作。 以下代码对我有用:

ComponentsTableAdapter cta = new ComponentsTableAdapter();                    
foreach (UpdaterDataSet.ComponentsRow r in uds.Components.Rows)
{                    
   long origId = r.Id;
   cta.Update(r);

   foreach (UpdaterDataSet.ComponentsRow s in uds.Components.Rows)
   {
      if (s.Id != r.Id && !s.IsComponentIdNull() && s.ComponentId == origId)
         s.ComponentId = r.Id;
   }                 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM