Я получаю исключение: "Определенный бросок не допустим", вот код
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();
В интересах полноты, в вашем примере кода есть три проблемы.
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();
}
}
Попробуйте так:-
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();
Сначала проверьте следующее:
object id = cmd.ExcuteScalar()
Установите точку останова и посмотрите тип id
. Вероятно, это Decimal
, и его нельзя напрямую преобразовать в int
.