2014-01-27 31 views
0

我明白錯誤的含義(您試圖在int中存儲大於int的數字),但無法看到這是從哪裏來的。scope_identity throwing System.Data.SqlClient.SqlException(0x80131904):將IDENTITY轉換爲數據類型的算術溢出錯誤int

由於錯誤身份提到的,我假設其調用SCOPE_IDENTITY()這是有問題的。我知道它返回十進制(38,0),但我的表應該永遠不會返回一個不是int的PK。

這段代碼運行好幾個月後,我剛剛開始接受這個問題。

幫助!!!!!

我有一個表,這個PK

CREATE TABLE [dbo].[plan_languages](
    [plan_language_id] [int] IDENTITY(1,1) NOT NULL, 
.... 
) 

和存儲過程返回新創建的PK

CREATE PROC [dbo].[sp_plan_languages_insert] (
...., 
,@new_pk INT = 0 OUTPUT 
) 
... 
INSERT INTO dbo.plan_languages (...) 
VALUES (...) 
SET @new_pk = scope_identity() 

和C#代碼執行該存儲過程並檢索PK

 private int InsertPlanLanguage(PlanLanguageDTO language) 
     { 
      int pk = 0; 
      try 
      { 
       using (SqlConnection con = new SqlConnection(DbConnetionString)) 
       { 
        con.Open(); 
        using (SqlCommand cmd = con.CreateCommand()) 
        { 
         cmd.CommandType = CommandType.StoredProcedure; 
         cmd.CommandText = "dbo.sp_plan_languages_insert"; 
.... 
         cmd.Parameters.Add(new SqlParameter { ParameterName = "@new_pk", Direction = ParameterDirection.Output, DbType = DbType.Int32 }); 


         cmd.ExecuteNonQuery(); 
         if (cmd.Parameters["@new_pk"].Value != DBNull.Value) 
         { 
          pk = (int)cmd.Parameters["@new_pk"].Value; 
         } 
        } 

我應該有足夠的空間

SELECT MAX(l.plan_language_id) from dbo.plan_languages l 

返回190891

回答

0

SELECT MAX(l.plan_language_id)從dbo.plan_languages升

這是不相關的:它返回plan_language_id列的當前最大值。下一個標識值不一定是MAX(id)+1,因爲行可能已被刪除。

嘗試:

DBCC CHECKIDENT(plan_languages) 

DBCC CHECKIDENT也有一個選項來補種標識值。雖然大概在再次運行插入和刪除行幾個月之後你會再次遇到同樣的問題。

+0

呵呵!!!它實際上是一個最大的子表:檢查身份信息:當前身份值'2147483647',當前列值'2147483647' – kevcoder

0

類型轉換返回的身份爲int通常會失敗對我來說SQL函數的返回值。我認爲,因爲System.Data.SqlClient將該值視爲十進制。請嘗試這樣做。

pk = Convert.ToIn32(cmd.Parameters["@new_pk"].Value); 
相關問題