[英]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.