2012-03-21 39 views
0

我正在內容管理系統上進行更新,以便管理員可以添加,編輯和刪除更新。SQL - 獲取isIdentity列的下一個值

在管理員添加更新的表單中,我想創建一個文本框,顯示數據庫中名爲'Update_ID'的isIdentity列的下一個值。我不能從數據庫中檢索最後一行,並向其中添加1,因爲如果管理員刪除數據庫中的最後一條記錄,文本框中的值將不會反映下一行的實際「Update_ID」。

請問這怎麼解決?有沒有辦法獲得數據庫中下一個isIdentity列的實際值?謝謝:)

+4

爲什麼不用你只需要一毫秒以後diplay該值,因爲它可能會有所不同?在通過['SCOPE_IDENTITY'](http://msdn.microsoft.com/de-de/library/ms190315.aspx)(SQL-Server)創建和檢索它之後,它只能被信任**。 – 2012-03-21 13:16:36

+0

@Tim Schmelter我需要在「添加更新」表單上顯示值。但是,當從同一表單添加圖像時,我需要在SQL語句中使用此值,這是發生真正問題的時間。 – Matthew 2012-03-21 13:18:35

+0

@Steve我正在使用SQL Server 2008.我的問題是,如果管理員刪除最後一行的標識爲23並且後來添加了更新,那麼文本框中的值將顯示23,並且在添加圖像時使用數字23表格,即使要插入的行的實際值爲24. – Matthew 2012-03-21 13:20:10

回答

3

如果你有興趣做這樣的事情,唯一有效的方法是實際插入空白行並將該行返回給用戶進行編輯,因爲你無法知道下一個ID將不會鎖定插入表,這可能不是你想要做的。

一個更有效的解決方案可能是在用戶最初輸入數據時不填寫Update_ID字段,而是通過選擇SCOPE_IDENTITY或從插入語句返回值來通知他們剛纔創建的ID。

編輯: 一個給你想要做的(如果你選擇升級到SQL Server 2012)什麼可能的選擇是使用Sequences的新功能。不過,我從來沒有用過它。

+0

謝謝:)問題是,從相同的窗體插入圖像時使用相同的'Update_ID'編號。請參閱我的問題下的最後兩條評論。 – Matthew 2012-03-21 13:23:50

+0

我覺得評論很混亂。我不確定你爲什麼在玩弄ID--從這些評論中很難理解系統的設計應該是什麼。無論哪種方式,知道下一個IDENTITY值(可能帶有IDENT_CURRENT)並使用該知識將關聯數據標記到尚未發生的插入是災難的祕訣。 – 2012-03-21 13:33:37

+0

@Matthew:查看編輯。我想知道你是否可以訪問SQL 2012? ;-) – 2012-03-21 15:20:33

1

你可以在會話或表範圍的最後插入的標識值,這裏是一些閱讀:

但你必須記住,那些值隨着每個插入到表中而變化,所以你不能相信它們。最好的方法是不要在前面顯示這個值。在相關資源的情況下,您可以創建一個存儲過程(或者只是一個內聯T-SQL塊),它將插入到主表中,檢索SCOPE_IDENTITY,然後插入到具有檢索值的子表中。

編輯

的上面我所(與ADO.NET)描述只是一個例子:

using (SqlConnection connection = new SqlConnection(_connectionString)) 
{ 
    connection.Open(); 

    SqlTransaction transaction = connection.BeginTransaction(); 

    int insertedIdentity; 
    using (SqlCommand command = new SqlCommand("INSERT INTO TableNames(ColumnsList) VALUES(@ValuesList) SELECT @InsertedIdentity = SCOPE_IDENTITY()", connection, transaction)) 
    { 
     command.CommandType = CommandType.Text; 
     //Add any parameters required by INSERT here, then add parameter for SCOPE_IDENTITY 
     ... 
     command.Parameters.Add(new SqlParameter("@InsertedIdentity", SqlDbType.Decimal) { Direction = ParameterDirection.Output }); 
     command.ExecuteNonQuery(); 
     insertedIdentity = Convert.ToInt32(command.Parameters["@InsertedIdentity"].Value); 
    } 

    //Now you can make all the child inserts using insertedIdentity and transaction 
    ... 

    transaction.Commit(); 
}