scope_identity thring System.Data.SqlClient.SqlException(0x80131904):将IDENTITY转换为数据类型int的算术溢出错误

时间:2014-01-27 18:05:07

标签: c# sql-server-2008-r2

我理解错误意味着什么(你试图在int中存储一个比int大的数字),但是看不出它来自哪里。

由于错误中提到了IDENTITY,我假设调用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

2 个答案:

答案 0 :(得分:0)

类型转换将返回标识的SQL函数的返回值通常对我失败。我认为因为System.Data.SqlClient将值视为十进制。试着这样做。

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

答案 1 :(得分:0)

  

来自dbo.plan_languages l的SELECT MAX(l.plan_language_id)

这不相关:它返回plan_language_id列的当前最大值。由于行可能已被删除,因此下一个标识值不一定是MAX(id)+1。

尝试:

DBCC CHECKIDENT(plan_languages)

DBCC CHECKIDENT还可以选择重新设定标识值。虽然在运行了几个月的插入和删除行之后,你可能会再次遇到同样的问题。