Ошибка «Объект«% »не является объектом последовательности» - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь сгенерировать новый номер с этими кодами.

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 »не является объектом последовательности.»

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Согласно моим комментариям, вам не нужен 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 147 483 647
  • bigint - Диапазон от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
  • десятичный и числовой со шкалой 0.
  • Любой определенный пользователем тип данных (тип псевдонима), основанный на одном из разрешенных типов.

Если тип данных не указан, bigint тип данных используется по умолчанию.

Акцент добавлен в последнюю строку. Вот почему ваш SEQUENCE является bigint, так как вы пропустили тип данных.

0 голосов
/ 04 ноября 2019

Вам не нужен SP, чтобы получить следующее значение из последовательности. Вы должны получить его непосредственно из самой последовательности. Вот почему вы получаете следующее сообщение:

Объект 'next_fis_number' не является объектом последовательности. "

Поскольку NEXT VALUE FOR ожидает объект последовательности, а не объектSP.

Итак, удалите ваш SP и измените код C #, чтобы он использовал его:

SELECT NEXT VALUE FOR seq_fisnumarasi;

Для сообщения об ошибке приведения ваша последовательность по умолчанию возвращает BIGINT, потому чтоявного типа данных не существует. BIGINT требует 8 байтов и переводится как Int64 или long в C #.

Вы приводите результат SQL к int в C #, чтопо умолчанию используется 4-байтовый размер (Int32). Поскольку потеря данных между 8-байтовым int и 4-байтовым int теряется, его нельзя преобразовать автоматически, поэтому возникает ошибка.

Чтобы исправить это,просто приведите к конкретному 8-байтовому целому числу в C #:

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
...