2015-10-06 32 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值? –