将Command.ExecuteScalar()转换为Int

时间:2019-06-18 21:17:29

标签: c# sql-server

我需要在问题表中插入一行并检索插入的ID。我初始化我的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 个答案:

答案 0 :(得分:1)

这与您的起点大相径庭。但是您遇到了几个问题。您应该在具有IDisposable接口(连接,命令等)的对象周围使用USING语句。

此代码未经测试,但应该非常接近。

从创建存储过程开始,以便您可以开始在应用程序中创建图层。

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

答案 1 :(得分:1)

要插入ID,请使用SCOPE_IDENTITY()在命令查询中添加SELECT CAST(scope_identity() AS int

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

SELECT CAST(scope_identity() AS int;

此查询将为您返回插入的ID。