2014-01-27 5 views
0

Я понимаю, что означает ошибка (вы пытаетесь сохранить число больше, чем int в int), но не можете видеть откуда это происходит.scope_identity throwing System.Data.SqlClient.SqlException (0x80131904): ошибка преобразования арифметического переполнения IDENTITY в тип данных int

Из-за упоминания IDENTITY в ошибке, я , предполагая, что его вызов scope_identity() является проблематичным. Я понимаю, что он возвращает десятичную (38,0), но моя таблица должна никогда не возвращать PK, который не является int.

Я только начал получать эту последнюю неделю после того, как этот код работал в течение нескольких месяцев.

Справка !!!!!

У меня есть таблица с этим ПК

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, поскольку строки могут быть удалены.

Try:

DBCC CHECKIDENT(plan_languages) 

DBCC CHECKIDENT также имеет возможность Reseed значение идентификатора. Хотя, вероятно, вы снова столкнетесь с той же проблемой после запуска еще несколько месяцев вставки и удаления строк.

+0

duh !!! на самом деле это таблица для детей, которая достигла максимума: проверка идентификационной информации: текущее значение идентификатора «2147483647», текущее значение столбца «2147483647» – kevcoder

0

Тип произнесения возвращаемого значения функции SQL, которые возвращают идентичность в целое, как правило, не может для меня. Я думаю, потому что System.Data.SqlClient обрабатывает значение как десятичное. Попробуйте сделать это вместо этого.

pk = Convert.ToIn32(cmd.Parameters["@new_pk"].Value); 
Смежные вопросы