根据我的评论,您不需要SP,并且使用的数据类型错误(因为您将SEQUENCE
声明为bigint)。只需对SELECT NEXT
对象使用SEQUENCE
,然后将函数声明为int64
,而不是int32
:
public int64 GetFisNumber()
{
var rawQuery = Database.SqlQuery<int64>("SELECT NEXT VALUE FOR seq_fisnumarasi ;");
var task = rawQuery.SingleAsync();
int64 nextVal = task.Result;
return nextVal;
}
请注意,如果您在c#的其他地方错误地将数据类型声明为int32
,则也需要将其更改为int64
。
如果您希望SEQUENCE
是int
,而不是bigint
,请在CREATE
时定义数据类型:
CREATE SEQUENCE seq_fisnumarasi AS int
START WITH 1
INCREMENT BY 1;
来自CREATE SEQUENCE
:
序列可以定义为任何整数类型。允许以下类型。
- tinyint -范围从0到255
- smallint -范围-32,768至32,767
- int -范围-2,147,483,648至2,647
- bigint -范围-9,223,372,036,854,775,808至9,807
- 十进制和数字,小数位数为0。
- 任何基于允许的类型之一的用户定义数据类型(别名类型)。
如果未提供数据类型,则将 bigint 数据类型用作默认数据。
强调已添加到最后一行。这就是为什么您的SEQUENCE
是bigint
的原因,因为您省略了数据类型。
,
您不需要SP即可从序列中获取下一个值。您应该直接从序列本身中获取它。这就是为什么您收到的消息是:
对象'next_fis_number'不是序列对象。“
因为NEXT VALUE FOR
需要一个序列对象,而不是SP。
因此删除您的SP并修改您的C#代码,以便它使用此代码:
SELECT NEXT VALUE FOR seq_fisnumarasi;
对于转换错误消息,由于没有显式的数据类型,因此默认情况下您的序列返回BIGINT
。 BIGINT
需要8个字节,并在C#中转换为Int64
或long
。
您正在将SQL的结果强制转换为C#中的int
,默认为4个大小的字节(Int32
)。由于8字节int到4字节int之间存在数据丢失,因此无法自动转换,因此会出错。
要修复此问题,只需将其转换为C#中的特定8字节整数:
var rawQuery = Database.SqlQuery<long>("SELECT NEXT VALUE FOR seq_fisnumarasi;");
或更改您的SEQUENCE
以返回4字节整数:
CREATE SEQUENCE seq_fisnumarasi
AS INT
START WITH 1
INCREMENT BY 1 ;
GO
本文链接:https://www.f2er.com/3167149.html