2013-08-29 39 views
0

當我運行這個方法GetNewID()時,它應該從數據庫返回最大的Product_Id + 1。所以如果數據庫中的最大Product_Id是20,那麼下一個應該是21. 這工作正常。如何在數據庫中沒有記錄時獲取新的ID?

但什麼不工作是當數據庫中沒有記錄,它是空的。我已經嘗試了一個不同的select語句和一些if語句,但沒有奏效。你有什麼想法可以解決這個問題嗎?提前致謝。

public static int GetNewId() 
    { 
     string selectString = @"SELECT MAX(Product_Id) FROM Products"; 
     try 
     { 
      newId= 0; 
      connection = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=DB;Integrated Security=SSPI;"); 
      connection.Open(); 

      SqlCommand cmdSelectLastId = new SqlCommand(selectString, connection); 

      newId = Convert.ToInt32(cmdSelectLastId.ExecuteScalar()); 

     } 
     finally 
     { 
      if (connection != null) 
      { 
       connection.Close(); 
      } 
     } 

     return newId + 1; 
    } 
+2

使用自動增量['IDENTITY'(http://technet.microsoft.com/en-us/library/ms188059。 aspx)的值。否則,你正在創造一個低效率的競爭條件。除此之外:'COALESCE'是你的朋友。 –

+0

我認爲最好在數據庫中創建一個序列和觸發器來處理這個問題。 – Jasti

回答

2

使查詢返回零,而不是空時,有沒有記錄:

string selectString = @"SELECT ISNULL(MAX(Product_Id),0) FROM Products"; 
+1

+1因爲希望OP希望 - 但是OP應該可能使用他們的SQL服務器的身份構造(IDENTITY,AUTO_INCREMENT等) – jdphenix

2

簡單的答案是:

SELECT ISNULL(MAX(Product_Id), 0) FROM Products 

然而,在你實施方式這可能充滿危險。例如,你是否考慮過兩個併發進程通過這個代碼一個接一個地運行,但是在第一個記錄被插入數據庫之前?

根據您的數據庫,最好使用自動生成的ID或GUID。

+0

比我想象的更容易,現在工作正常!我認爲目前沒有問題,但我會在後期的項目中考慮這個問題! – user1587603

+1

@ user1587603非常重要的是,使用標識字段更容易。如果您要遵循最佳做法,請儘快開始遵守,而不是晚些時候。 –

0
SELECT COALESCE(MAX(Product_Id), 0) FROM Products 

,您可以在查詢中添加1,太:

SELECT COALESCE(MAX(Product_Id), 0) +1 FROM Products 
相關問題