sql >> データベース >  >> RDS >> Sqlserver

scope_Identity() を使用して最後に挿入された ID を取得する

    クエリを 2 つのクエリに分割しないでください。挿入クエリ内で結果を選択/設定する必要があります。

    私はあなたのために例を作りました:

    最初のメソッドは、select を使用して単一の値を返します。

    private void Method1()
    {
        string sEmail = "[email protected]";
        string passwordHash = "#[email protected]#[email protected]!#@[email protected]#!#@$!#@$!";
        string salt = "????";
        string sName = "John";
    
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
            try
            {
                sqlConnection.Open();
    
                string insertStatement = "INSERT INTO [User] "
                                            + "(email, hash, salt, name) "
                                            + "VALUES (@email, @hash, @salt, @name)"
    
                                            + "SELECT SCOPE_IDENTITY()";
    
                using (SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection))
                {
    
                    insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
                    insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
                    insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
                    insertCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = sName;
    
    
                    int userId = Convert.ToInt32(insertCommand.ExecuteScalar());
                    Trace.WriteLine("User created with id: " + userId);
                }
            }
    
            catch (SqlException ex)
            {
                Trace.WriteLine(ex.Message);
                //lblMessage.Text = ex.Message;
            }
    }
    

    2 番目の方法は、出力パラメーターを定義することです。この方法では、複数の値を返すことができます。

    private void Method2()
    {
        string sEmail = "[email protected]";
        string passwordHash = "#[email protected]#[email protected]!#@[email protected]#!#@$!#@$!";
        string salt = "????";
        string sName = "John";
    
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
            try
            {
                sqlConnection.Open();
    
                string insertStatement = "INSERT INTO [User] "
                                            + "(email, hash, salt, name) "
                                            + "VALUES (@email, @hash, @salt, @name)"
    
                                            + "SET @user_id = SCOPE_IDENTITY()";
    
                using (SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection))
                {
    
                    insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
                    insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
                    insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
                    insertCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = sName;
    
                    insertCommand.Parameters.Add("@user_id", SqlDbType.Int).Direction = ParameterDirection.Output;
    
                    insertCommand.ExecuteNonQuery();
    
                    int userId = Convert.ToInt32(insertCommand.Parameters["@user_id"].Value);
                    Trace.WriteLine("User created with id: " + userId);
                }
            }
    
            catch (SqlException ex)
            {
                Trace.WriteLine(ex.Message);
                //lblMessage.Text = ex.Message;
            }
    }
    

    できる最善の方法は、クエリが静的である場合、これらのクエリをストアド プロシージャ内に配置することです。これにより、クエリが高速化されます。



    1. mysql-connector-python2.0.1-1とpython-mysql.connectorの競合

    2. カードとサービスごとに、最新のレコードと(同点の場合)より高い値またはパーセンテージを取得するためにクエリを実行します

    3. Python:datetime.timedeltaオブジェクトから時間を取得するにはどうすればよいですか?

    4. MySQLのテーブルフィールドにインデックスが存在するかどうかを確認するにはどうすればよいですか?