2010-07-06 46 views
0

我已經有一些DataTables的ID列與啓用AutoIncrement在MySQL服務器端和ADO.NET架構端(從XML模式文件加載)。插入行時,我不想關心這些ID,因爲它們的唯一用途是爲表提供一個主鍵 - 沒有外鍵引用。但是,當要添加新行時,DataTable將已經包含行,即ID從1開始的行已經駐留在DataTable中。DataTable.Rows.Add與AutoIncrement列ConstraintException

ID列的默認AutoIncrementSeed值爲-1,AutoIncrementStep值爲1(僅保留Visual Studio提供的默認值)。如果我只想一次插入兩個新行,所有東西似乎都很好,因爲當使用dataTable.NewRow()創建它們時,它們會得到ID -1和0.但是,如果我想添加第三行,它將獲得ID 1由NewRow()分配。隨後,當我想插入帶有dataTable.Rows.Add(...)的新行時拋出ConstraintException,因爲已經有一行ID = 1。

我想禁用ADO.NET的AutoIncrement內容架構是沒有解決方案,因爲然後我仍然必須確保我自己的ID是唯一的,然後我添加行.Rows.Add()

什麼是這個問題的簡單/優雅的解決方案?現在我無法想象這是一個非常罕見的任務。

謝謝!

回答

1

一個非常簡單的方法來解決這個問題設置AutoIncrementStep屬性設置爲-1,以及 - 隨後的ID會降低,即,-1,-2,-3,等

希望這有助於 史蒂夫

0

你可以嘗試一下類似於我在下面提供的例子。您可以驗證獨特的列值是否已經存在使用上表中選擇添加另一行之前:

using (SqlConnection connection = new SqlConnection(sqlConnectionStr)) 
     { 
      connection.Open(); 
      // Do work here. 
      DataTable userTable = new DataTable("usertable"); 

      using (SqlCommand sqlCmd = new SqlCommand("select * from [user]")) 
      { 
       sqlCmd.Connection = connection; 
       SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCmd); 
       dataAdapter.Fill(userTable); 
      } 

      int newUserId = 3; 
      DataRow[] selectedRows = userTable.Select( string.Format("id={0}", newUserId)); 
      bool userIdAlreadyTaken = selectedRows.Length > 0 ; 
      if(!userIdAlreadyTaken) 
      { 
       // Add new user 
       DataRow newRow = userTable.Rows.Add(new object[] { 3, "John" }); 
      } 
     } 
+0

謝謝您的回覆,但我覺得我一直在尋找不同的東西。你的方法應該能夠工作,但我的目標是以一種不必分配或檢查ID的方式進行安排。實際上,任何「離線」分配的ID都不會將其放入MySql數據庫中,因爲SQL插入語句不會提及該ID。這就是爲什麼我認爲會有一種「沒有」他們的工作方式。 – JayK 2010-07-06 20:57:20

相關問題