【问题标题】:ADO.NET Increment ID on add new rowADO.NET 在添加新行时增加 ID
【发布时间】:2016-01-03 15:44:33
【问题描述】:

我正在尝试向我的 GridView 添加新值,这些值稍后会传递给缓存和数据集以及底层 SQL 数据库。

这是我的代码,但我不知道在 "dataRow["ID"]=" 行上输入什么,如您所见。如果我只是给“ID”任何不存在的数字,其他一切都可以正常工作,并且其他值将添加到数据库中。

protected void insertStudent_Click(object sender, EventArgs e)
    {
        DataSet dataSet = (DataSet)Cache["DATASET"];

        //DataRow dataRow = dataSet.Tables["Students"].Rows.Find(e.Keys["ID"]);

        dataSet.Tables["Students"].PrimaryKey = new DataColumn[] { dataSet.Tables["Students"].Columns["ID"] };

        DataRow dataRow = dataSet.Tables["Students"].NewRow();

        dataRow["ID"]           =

        dataRow["FirstName"]    = ((TextBox)GridView1.FooterRow.FindControl("txtFirstName")).Text;
        dataRow["LastName"]     = ((TextBox)GridView1.FooterRow.FindControl("txtLastName")).Text;
        dataRow["Gender"]       = ((DropDownList)GridView1.FooterRow.FindControl("DropDownListGender")).SelectedValue;
        dataRow["Course"]       = ((DropDownList)GridView1.FooterRow.FindControl("DropDownListCourse")).SelectedValue;
        dataRow["Grade"]        = ((DropDownList)GridView1.FooterRow.FindControl("DropDownListGrade")).SelectedValue;

        Cache.Insert("DATASET", dataSet, null, DateTime.Now.AddHours(24), System.Web.Caching.Cache.NoSlidingExpiration);

        dataSet.Tables["Students"].Rows.Add(dataRow);

        GridView1.DataSource = (DataSet)Cache["DATASET"];
        GridView1.DataBind();
    }

【问题讨论】:

  • 您不应键入任何内容。通常数据库有 ID 字段的自动增量设置,所以新条目有一个唯一的 id = last used id + 1
  • 如果我不添加任何内容,我会收到“列 ID 不能为空”的异常。关于如何在每个新条目上使用 SQL 增加 ID 的任何想法?谢谢!
  • 这正是我所说的,你应该设置数据库来为你处理这个问题。如果您使用的是 SQL Server,请查看 this thread 示例
  • 对不起,我已经让它增加 1,就像他们在你发布的那个线程上所说的那样。仍然没有关于如何向 ID 列添加新 ID 并递增 1 的想法?
  • 哦,好吧,那一定是DataTable扔的。对于 ID DatColumn,尝试设置 AutoIncrement = trueAllowDBNull = true。前者看起来更有希望

标签: sql asp.net gridview ado.net


【解决方案1】:

根据上面评论中的 Andrei,将表格中的 ID 列设置为:

CREATE TABLE sample( ID INT IDENTITY(1,1) NOT NULL,
                     FirstName VARCHAR(50) )) -- And your rest of the details

不需要给 ID 添加值,它会自行递增。插入其他值,当您从数据库中读取时,您的 ID 列会增加。

附:向表中插入其他值时不要包含 ID 列。

Google 'SQL INCREMENT' 了解更多信息。

【讨论】:

  • 我正在做的是将数据从数据库获取到数据集,缓存数据集。因此,当我添加新值时,我会将它们添加到数据集,存储在缓存中,然后将新值发送到数据库。这使我可以在我的应用程序中离线处理数据。如果我不提供 ID 会抛出异常,并且主键不能为 Null。 “insertStudent_Click”按钮只是向数据集添加值,当数据被发送回数据库时,ID 将自动递增。所以我需要将 ID 添加到 DataSet。
  • 这不起作用:dataSet.Tables["Student"].Columns["ID"].AllowDBNull == true;有关如何使 DataSet 中的该列分配空值的任何想法?
  • 哦,明白了!那么如何:从缓存的数据表中删除 ID 列,再次使用 INCREMENT 属性添加 ID 列。我确信这将在数据表中工作。稍后使用 dataTable 更新您的数据库表。您可以找到有关如何删除列的信息LINK 并且,在这里您可以找到如何将列添加到 dataTableLINK
  • 这样就解决了问题:dataSet.Tables["Students"].Columns["ID"].AutoIncrement = true;
【解决方案2】:

这个问题的答案是在缓存数据集中的 ID 列上使用 AutoIncrement。然后当您保存到数据库时,添加的行将在数据库中获得正确的 ID。

dataSet.Tables["Students"].Columns["ID"].AutoIncrement = true;

【讨论】:

  • 所以是 DataSet 抛出异常,并且建议的自动增量属性有效。很高兴知道
  • 是的。但现在的问题是 AutoIncrement 可以添加一个已经存在的 ID 值并最终引发异常。所以我们需要添加唯一的 ID 值,也许现在通过查看 DataSet 中的最高 ID 值?
猜你喜欢
  • 2023-01-03
  • 1970-01-01
  • 2023-03-24
  • 2016-06-15
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多