"Object '%' is not a sequence object" 错误

"Object '%' is not a sequence object" error

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

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;
    }

将此添加到我的 Entity Framework 上下文中。

txtFisNumber.Text = context.GetFisNumber().ToString();

最后,叫"GetFisNumber()"到我的表格。

但是,我遇到了一个错误。这里: "内部异常 1: SqlException: 对象 'next_fis_number' 不是序列对象。"

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

Object 'next_fis_number' is not a sequence object."

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

所以删除你的 SP 并修改你的 C# 代码,以便它使用这个:

SELECT NEXT VALUE FOR seq_fisnumarasi;

对于转换错误消息,您的序列 return 默认为 BIGINT 因为没有明确的数据类型。 BIGINT 需要 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 更改为 return 一个 4 字节整数:

CREATE SEQUENCE seq_fisnumarasi
    AS INT
    START WITH 1  
    INCREMENT BY 1 ;  
GO

根据我的意见,您不需要 SP,并且您使用了错误的数据类型(因为您将 SEQUENCE 声明为 bigint)。只需对 SEQUENCE 对象使用 SELECT NEXT,并将您的函数声明为 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:

A sequence can be defined as any integer type. The following types are allowed.

  • tinyint - Range 0 to 255
  • smallint - Range -32,768 to 32,767
  • int - Range -2,147,483,648 to 2,147,483,647
  • bigint - Range -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • decimal and numeric with a scale of 0.
  • Any user-defined data type (alias type) that is based on one of the allowed types.

If no data type is provided, the bigint data type is used as the default.

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