我理解错误意味着什么(你试图在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
答案 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还可以选择重新设定标识值。虽然在运行了几个月的插入和删除行之后,你可能会再次遇到同样的问题。