Преобразовать Command.ExecuteScalar () в Int - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно вставить строку в мою таблицу вопросов и получить вставленный идентификатор. Я инициализирую свою команду sql и выполняю ее с ExecuteScalar(). Я пытаюсь преобразовать результат этого метода в int, но я не могу это сделать.

Я пытался сделать это:

int result = Convert.ToInt32(Command.ExecuteScalar));

или

int result = (int)Command.ExecuteScalar();

но ничего не работает

вот моя функция

public int AddQuestionOrientation(Question questionForAdd)
    {
        try
        {
            con = new SqlConnection(connectionString);
            con.Open();
            SqlCommand command;
            String sql = "";
            sql = "INSERT INTO QUESTION VALUES(@Libelle, 
            @Bareme,2,@Filliere)";

            SqlParameter param = new SqlParameter();
            param.ParameterName = "@Libelle";
            param.Value = questionForAdd.Libelle;

            SqlParameter param2 = new SqlParameter();
            param2.ParameterName = "@Bareme";
            param2.Value = questionForAdd.Bareme;

            SqlParameter param3 = new SqlParameter();
            param3.ParameterName = "@Filliere";
            param3.Value = questionForAdd.IdFiliere;

            command = new SqlCommand(sql, con);
            command.Parameters.Add(param);
            command.Parameters.Add(param2);
            command.Parameters.Add(param3);
            int idQuestionInserted = (int)command.ExecuteScalar();
            command.Dispose();
            con.Close();
            return idQuestionInserted;
        }
        catch(Exception ex)
        {
            return 0;
        }
    }

Если я пытаюсь использовать приведение (int), у меня появляется сообщение об ошибке:

Ссылка на объект не установлена ​​для экземпляра объекта

Если я попробую с Convert.ToInt32, моя переменная "IdQuestionInserted" будет равна 0.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Чтобы получить вставленный идентификатор, используйте SCOPE_IDENTITY(), добавьте SELECT CAST(scope_identity() AS int в командный запрос, чтобы сделать

INSERT INTO QUESTION
  VALUES(@Libelle, @Bareme, 2, @Filliere);

SELECT CAST(scope_identity() AS int;

этот запрос вернет вставленный идентификатор для вас.

1 голос
/ 19 июня 2019

Это большой отход от того, с чего вы начали.Но у вас есть несколько проблем.Вы должны использовать оператор USING для объектов с интерфейсом IDisposable (соединения, команды и т. Д.).

Этот код не проверен, но должен быть очень близким.

Начните с созданияхранимой процедуры, чтобы вы могли начать создавать слои в своем приложении.

create Procedure Question_Insert
(
    @Libelle varchar(50)
    , @Bareme varchar(50)
    , @Filliere varchar(50)
    , @QuestionID int output
) as
    set nocount on;

    INSERT INTO QUESTION
    (
        Libelle
        , Bareme
        , Filliere
    )
    values
    (
        @Libelle
        , @Bareme
        , @Filliere
    )

    select @QuestionID = SCOPE_IDENTITY()

Затем в вашем коде dotnet вам нужно изменить несколько вещей, чтобы сделать его более чистым и надежным.В идеале вы должны делать что-то лучше, чем просто возвращать 0 в случае ошибки.Отладка будет очень сложной, если что-то пойдет не так, если вы просто вернете 0. Это похоже на сообщение об ошибке «Произошла ошибка».Довольно бесполезно.Сделайте что-нибудь с ошибкой.Захватите сообщение, чтобы вы могли исправить его.

public int AddQuestionOrientation(Question questionForAdd)
        {
            try
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    con.Open();
                    using (SqlCommand command = new SqlCommand("Question_Insert"))
                    {
                        command.CommandType = CommandType.StoredProcedure;

                        command.Parameters.Add("@Libelle", SqlDbType.VarChar, 50).Value = questionForAdd.Libelle;
                        command.Parameters.Add("@Bareme", SqlDbType.VarChar, 50).Value = questionForAdd.Bareme;
                        command.Parameters.Add("@Filliere", SqlDbType.VarChar, 50).Value = questionForAdd.IdFiliere;
                        command.Parameters.Add("@QuestionID", SqlDbType.Int).Direction = ParameterDirection.Output;
                        command.ExecuteNonQuery();
                        return int.Parse(command.Parameters["@QuestionID"].Value.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                return 0;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...