2013-08-12 61 views
-2

我想插入記錄到sql server 2008表中,使用c#asp.net,列值都被聲明爲「nvarchar」,並且第一列subid是主鍵。在我的代碼中,我檢索最後一個coulmn id,遞增它並將其用作新記錄的子標識符,當我插入一條記錄時,它不會按順序存儲,而是存儲在中間的某處。因此,下次嘗試檢索最後一個id列值(儘管我使用「order by」),它給出了現有的值,當它遞增時,會給出一個錯誤,「重複值,不允許」。 這是我的代碼來檢索值的最後一個ID,並增加它:特定行後插入記錄

 SqlCommand myCommand = new SqlCommand("SELECT TOP 1 subid FROM subjects       

     ORDER BY subid DESC", con1);   

      reader = myCommand.ExecuteReader(); 
      if (reader.HasRows == false) 
      { 
       Label4.Text = "1"; 
       reader.Close(); 
      } 
      else 
      { 
       while (reader.Read()) // if can read row from database 
       { 

        id = reader[0].ToString(); 

       } 
       int n = Convert.ToInt32(id); 
       int j = n + 1; 
       Label4.Text = j.ToString(); 

我插入的代碼是:

 SqlDataAdapter da = new SqlDataAdapter("SELECT TOP 1 * FROM subjects ORDER BY  
     subid DESC", con); 
     SqlCommandBuilder cb = new SqlCommandBuilder(da); 
     DataSet ds = new DataSet("subjects"); 
     da.Fill(ds, "subjects"); 
     DataRow row = ds.Tables["subjects"].NewRow(); 
     row["subid"] = Label4.Text; 
     row["dept"] = (string)Session["deptmnt"]; 
     row["yr"] = DropDownList2.SelectedValue; 
     row["sem"] = DropDownList3.SelectedValue; 
     row["subname"] = TextBox1.Text; 
     row["subcode"] = TextBox2.Text; 

     ds.Tables["subjects"].Rows.Add(row); 
     da.Update(ds, "subjects"); 

     Label10.Visible = true; 
     con.Close(); 

如何使價值得到插在最後一行,請幫助。 我的subid具有類似「IT10001」,「EC10001」的值,以便根據前兩個字母識別部門,這就是爲什麼我要使用varchar!

+2

這種方法是一個非常可怕的設計 - 您不應該使用「SELECT MAX(..)+ 1」方法來創建新的ID值。這是**不安全**負載下 - 如果多個用戶使用此應用程序,而不是稍後您會有重複。 **不要這樣做!**在表中使用'INT IDENTITY'列,讓SQL Server爲您處理ID的唯一性。 –

+0

@marc_s出於興趣,你每天需要告訴人們多少次? ;-) – Bridge

+0

@Bridge:**方式太多次了!** :-( –

回答

2

在NVarchChar字段上的排序將以字符串形式完成。因此,它將繼續與NVARCHAR一起發生。正確的方法是在數據庫中將add an integer column設置爲auto-increment。這將確保您在添加新行之前不必每次都獲得最大值。

+0

,謝謝,但是,我已經創建了許多表,與varchar,所以,現在我不能改變表也作爲整數,所以,請給另一種替代方式 – user2605748

+0

不可能與nvarchar。您將不得不吞下藥片 – Ehsan

+2

如果您發現不合格的設計,請儘快更換。你以後只會打開更多的痛苦。 – SWeko

2

你有表達式SELECT TOP 1 * FROM subjects ORDER BY subid DESC

如果subid是NVarChar,如您所說,排序是在字符串上進行的,而不是數字。這意味着'10'<'2'。假設你有1000條記錄,他們將被勒令:

1 
10 
11 
.. 
19 
100 
101 
... 
1000 
2 
20 
21 
... 
... 
999 

所以,每一次你試圖獲得最大數量,你會得到字符串「999」回來,因爲它是最大的詞彙。

最簡單的解決方案是將列更改爲整數,因爲它實際上是一個整數。 如果你絕對肯定不能改變它,那麼至少填充零值,所以有「0001」,「0002」,「0010」而不是「1」,「2」,「10」。

此外,使用MAX + 1方法,要求您使用事務處理所有事情,因爲併發問題。使用int標識作爲主鍵爲您解決了這些問題。