“对象'%'不是序列对象”错误

时间:2019-11-04 11:27:56

标签: c# sql-server entity-framework sequence procedure

我正在尝试使用这些代码生成新号码。

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'不是序列对象。“

2 个答案:

答案 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

如果您希望SEQUENCEint,而不是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,147,483,647
  •   
  • bigint -范围-9,223,372,036,854,775,808至9,223,372,036,854,775,807
  •   
  • 十进制数字,小数位数为0。
  •   
  • 任何基于允许的类型之一的用户定义数据类型(别名类型)。
  •   
     

如果未提供数据类型,则将 bigint 数据类型用作默认数据。

强调已添加到最后一行。这就是为什么您的SEQUENCEbigint的原因,因为您省略了数据类型。

答案 1 :(得分:0)

您不需要SP即可从序列中获取下一个值。您应该直接从序列本身中获取它。这就是为什么您收到的消息是:

  

对象'next_fis_number'不是序列对象。“

因为NEXT VALUE FOR需要一个序列对象,而不是SP。

因此删除您的SP并修改您的C#代码,以便它使用此代码:

SELECT NEXT VALUE FOR seq_fisnumarasi;

对于转换错误消息,由于没有显式的数据类型,因此默认情况下您的序列返回BIGINTBIGINT需要8个字节,并在C#中转换为Int64long

您正在将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