почему SELECT SCOPE_IDENTITY() возвращает значение null?

Я пытаюсь получить идентификатор, сгенерированный последней функцией вставки. Я очень мало понимаю в Scope и Session. Но, читая блоги и другие источники, я понял, что мне следует использовать функцию Scope_Identity(). Но я получаю нулевое значение. Вот мой код:

 public int InsertUser(string username, string gender, string agegroup, string email, int partnerID, string userType)
{
    try
    {
        string query = "Insert into tblUser (username,gender,agegroup,email,partnerid,usertype) values (@username,@gender,@age,@email,@partnerid,@usertype)";
        SqlCommand cmd = new SqlCommand(query, _dbConnection.getCon());
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@gender", gender);
        cmd.Parameters.AddWithValue("@age", agegroup);
        cmd.Parameters.AddWithValue("@email", email);
        cmd.Parameters.AddWithValue("@partnerid", partnerID);
        cmd.Parameters.AddWithValue("@usertype", userType);
        if (cmd.ExecuteNonQuery() > 0)
        {
            query = "select scope_identity() as id";
            cmd = new SqlCommand(query, _dbConnection.getCon());
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adp.Fill(dt);// dt is showing no value in it
            return 1;// This should return ID

        }
        else {
            return -1;
        }

    }
    catch (Exception e) {
        throw e;
    }
}

Как я могу этого добиться?


person Hakoo Desai    schedule 12.08.2013    source источник


Ответы (1)


Попробуйте добавить SELECT scope_identity() к вашему первому запросу, а затем получить идентификатор, используя var identity = cmd.ExecuteScalar() вместо запуска cmd.ExecuteNonQuery().

person SteveChapman    schedule 12.08.2013
comment
Этот сработал. Спасибо. Я думал об этом, но остановился на предыдущем, потому что, если я запускаю оператор select scope_identity() в редакторе sql после оператора Insert, он работает. - person Hakoo Desai; 12.08.2013
comment
Проблема заключается в пакетной обработке; API-интерфейс ADO.NET будет обертывать параметризованные операторы INSERT в sp_executesql, а scope_identity будет возвращать идентификатор только в том случае, если он выполняется в той же области. - person SteveChapman; 12.08.2013
comment
Спасибо за ваш ответ. Как я понял, сеанс означает выполнение запросов в одном и том же открытом и закрытом соединении. И объем с точки зрения таблиц. Можете ли вы сказать мне, что такое точное значение Scope и Session в терминах SQL? - person Hakoo Desai; 12.08.2013
comment
Трудно объяснить в ветке комментариев... но вот рекомендуемое чтение: SCOPE_IDENTITY. - person SteveChapman; 12.08.2013