2015-10-06 58 views
0

我正在尝试向我的GridView添加新值,稍后传递给Cache和DataSet以及基础SQL数据库。添加新行的ADO.NET增量ID

这是我的代码,但我不知道在行“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(); 
    } 
+0

你不应该输入任何东西。通常数据库有ID字段的自动增量设置,所以新条目有一个唯一的ID =最后使用的ID + 1 – Andrei

+0

如果我不添加任何东西,我会得到一个异常,“列ID不能为空”。关于如何在每个新条目上使用SQL来增加ID的任何想法?谢谢! –

+0

这就是我正在谈论的,你应该设置数据库来处理这个问题。如果您正在使用SQL Server,请查看[this thread](例如http://stackoverflow.com/questions/10991894/auto-increment-primary-key-in-sql-server-management-studio-2012) – Andrei

回答

0

按安德烈在上面的评论,设置您的ID列在表中:

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

无需值添加到ID,则会自动递增。插入其他值,当您从数据库读取数据时,您的ID列增加。

P.S.在将其他值插入表格时不要包含ID列。

Google'SQL INCREMENT'获取更多信息。

+0

我在做什么是从数据库中获取数据到数据集中,缓存数据集。因此,当我添加新值时,我将它们添加到数据集中,存储在缓存中,然后将新值发送到数据库。这使我可以在我的应用程序中离线处理数据。如果我没有提供ID,它会抛出一个异常,并且主键不能为空。 “insertStudent_Click”按钮仅向DataSet添加值,当数据发送回数据库时,ID将自动递增。所以我需要将ID添加到DataSet中。 –

+0

这不起作用:dataSet.Tables [“Student”]。Columns [“ID”]。AllowDBNull == true;有关如何使DataSet中的列变为空值的任何想法? –

+0

Ohh Gotcha!那么怎么样: 从缓存的数据表中删除ID列, 再次添加ID列与INCREMENT属性。 我敢肯定,这将在dataTable中工作。 稍后使用dataTable更新您的数据库表。 您可以找到有关如何删除列[info](http://stackoverflow.com/questions/673616/how-can-i-delete-a-column-of-a-dataset)的信息 而且,在这里你可以找到如何添加一列到dataTable [LINK](http:// stackoverflow。com/questions/23410046/c-sharp-adding-row-to-datatable-which-has-an-auto-increment-column) – singhsac

0

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

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

所以它是DataSet引发异常,并建议autoincrement属性工作。有用的信息 – Andrei

+0

是的。但现在的问题是,AutoIncrement可以添加一个已经存在的ID值,并最终抛出一个异常。所以我们需要添加唯一的ID值,也许通过查看DataSet中最高的ID值? –