Определенный бросок не допустим при получении scope_identity

Я получаю исключение: "Определенный бросок не допустим", вот код

con.Open();
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();";

SqlCommand cmd = new SqlCommand(insertQuery, con);
cmd.ExecuteNonQuery();
tenderId = (int)cmd.ExecuteScalar();
9
задан coure2011 12 June 2010 в 06:34
поделиться

4 ответа

В интересах полноты, в вашем примере кода есть три проблемы.

1) Вы выполняете свой запрос дважды, вызывая ExecuteNonQuery и ExecuteScalar . В результате вы будете вставлять две записи в свою таблицу при каждом запуске этой функции. Ваш SQL, хотя и является двумя разными операторами, будет работать вместе, поэтому вам понадобится только вызов ExecuteScalar .

2) Scope_Identity () возвращает десятичное число . Вы можете либо использовать Convert.ToInt32 для результата вашего запроса, либо вы можете преобразовать возвращаемое значение в десятичное, а затем в int.

3) Обязательно заключите ваши соединения и объекты команд в , используя операторы , чтобы они были правильно размещены.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        connection.Open();
        int tenderId = (int)(decimal)command.ExecuteScalar();
    }
}
22
ответ дан 4 December 2019 в 07:22
поделиться

Попробуйте так:-

con.Open();
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();";

SqlCommand cmd = new SqlCommand(insertQuery, con);
tenderId = Convert.ToInt32(cmd.ExecuteScalar());

EDIT

Должно быть так, поскольку правильно указано, что scope_identity() возвращает numeric(38,0) :-

tenderId = Convert.ToInt32(cmd.ExecuteScalar());

Примечание: Вам все еще нужно удалить:-

cmd.ExecuteNonQuery();
5
ответ дан 4 December 2019 в 07:22
поделиться

Сначала проверьте следующее:

object id = cmd.ExcuteScalar()

Установите точку останова и посмотрите тип id . Вероятно, это Decimal , и его нельзя напрямую преобразовать в int .

2
ответ дан 4 December 2019 в 07:22
поделиться

ему нужен Convert.ToInt32 (cmd.ExecuteScalar ());

1
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: