我正在尝试使用这些代码生成新号码。
CREATE SEQUENCE seq_fisnumarasi
START WITH 1
INCREMENT BY 1 ;
GO
首先,我创建了一个序列。
CREATE PROCEDURE next_fis_number
AS
BEGIN
SELECT NEXT VALUE FOR seq_fisnumarasi
END
然后创建此过程。
public int GetFisNumber()
{
var rawQuery = Database.SqlQuery<int>("SELECT NEXT VALUE FOR next_fis_number;");
var task = rawQuery.SingleAsync();
int nextVal = task.Result;
return nextVal;
}
将此添加到我的实体框架上下文中。
txtFisNumber.Text = context.GetFisNumber().ToString();
最后,将其称为“ GetFisNumber()”。
但是,我遇到了一个错误。这里: “内部例外1: SqlException:对象'next_fis_number'不是序列对象。“
答案 0 :(得分:2)
根据我的评论,您不需要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;
序列可以定义为任何整数类型。允许以下类型。
- tinyint -范围从0到255
- smallint -范围-32,768至32,767
- int -范围-2,147,483,648至2,147,483,647
- bigint -范围-9,223,372,036,854,775,808至9,223,372,036,854,775,807
- 十进制和数字,小数位数为0。
- 任何基于允许的类型之一的用户定义数据类型(别名类型)。
如果未提供数据类型,则将 bigint 数据类型用作默认数据。
强调已添加到最后一行。这就是为什么您的SEQUENCE
是bigint
的原因,因为您省略了数据类型。
答案 1 :(得分:0)
您不需要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