【问题标题】:Load empty database table加载空数据库表
【发布时间】:2012-06-04 03:26:12
【问题描述】:

我正在使用 SQL Server Express 和 VS2008。

我有一个带有表A 的数据库,其中有一列IDIDENTITY。 ID 是自动递增的。即使该行被删除,ID 仍然会增加。

经过多次数据操作,例如当前ID已达到15个。

当我运行应用程序时

  • 如果至少有 1 行:如果我添加新行,则新 ID 为 16。一切正常。
  • 如果表是空的(没有行):如果我添加一个新行,新的ID是0,这是一个错误(我认为)。

进一步的数据操作(例如删除或更新)将导致未处理的异常。

有人遇到过吗?

PS。在我的表定义中,ID 已选择如下:

Identity Increment = 1; Identity Seed =1;

数据库加载代码为:

dataSet = gcnew DataSet();

dataAdapter->Fill(dataSet,"A");

dataTable=dataSet->Tables["A"];

dbConnection->Open();

更新按钮方法

dataAdapter->Update(dataSet,"tblInFlow");

dataSet->AcceptChanges();

dataTable=dataSet->Tables["tblInFlow"];

dataGrid->DataSource=dataTable;

如果我按更新:

  • 如果至少有一行:数据网格视图会更新并正确显示表格。

  • 如果表中没有任何内容(没有数据行),Add 方法将添加一个新行,但从 ID 0 开始。 如果我关闭程序并重新启动它:ID 将是 16,这是正确的。

这是添加方法

row=dataTable->NewRow();

row["column1"]="something";

dataTable->Rows->Add(row);

dataAdapter->Update(dataSet,"A");

dataSet->AcceptChanges();

dataTable=dataSet->Tables["A"];

【问题讨论】:

  • 能否给出表格的定义,以及表格为空时添加新行的代码?听起来要么表格最初没有正确播种,要么您正在手动重新播种。如果标识应从 1 开始,则配置应为 IDENTITY(1,1),因此除非发生其他事情,否则不应获得 0。所以你需要提供更多信息。
  • 我认为在声明标识列时,您需要指定种子和增量值,例如 CREATE TABLE dbo.MyTable (ID int identity(1,1), Name varchar(20))
  • 请看看我上面编辑过的问题。谢谢。
  • 你能告诉我你如何重新设置身份列吗?
  • 我没有重新播种该列。我让它自动。也许有时更新表格需要时间。如果数据网格显示行 ID 为 14(表中最大的 ID)虽然 ID 达到 16(行 15 和 16 已被删除),数据网格视图上显示的新添加的 ID 为 15,但实际 ID因为数据是 17。如果我关闭程序并重新启动它,它会正确显示 17。

标签: sql-server visual-studio unhandled-exception sqldataadapter


【解决方案1】:

如果您使用

删除日期
 Delete from myTable

它不会重置标识列,但另一方面,如果您截断表格,那么它将任何标识列重置为默认种子值(在您的情况下从 1 开始) 如果你正在截断表然后重新播种,如果你写,第一个身份重新播种值将是 0

 DBCC CHECKIDENT(MyTable, RESEED, 0)

即使您的标识列指定为 Identity=1 和种子 =1 ,插入的第一行将从 Id=0 开始

如果您想从 1 开始,那么您需要将列重新设置为

 DBCC CHECKIDENT(MyTable, RESEED, 1)

【讨论】:

  • 你好,我的问题是:有时候加载的表不好,如果成功的话ID已经达到200,不管列表有多少项,新插入的项都应该是201。但有时如果最大项目的 ID 为 105,则新插入的项目是 106 而不是 201。这种情况只是“有时”
猜你喜欢
  • 2020-05-02
  • 2016-02-22
  • 1970-01-01
  • 2017-02-24
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多