c#: ExecuteNonQuery () возвратит -1

Ive использовал этот метод раньше, чтобы вернуть количество измененных строк. Я должен запустить метод insert, insert отлично работает в хранимой процедуре, но возвращаемое значение из ExecuteNonQuery всегда возвращает -1.

вот мой C# код:

int ret = 0;

using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand(QueryName, conn))
    {
        conn.Open();

        if (Params != null)
            cmd.Parameters.AddRange(Params);

        cmd.CommandType = CommandType.StoredProcedure;

        ret = cmd.ExecuteNonQuery();

        conn.Close();
    }
}

return ret;

почему я получаю -1 вместо фактического количества измененных строк?

4 ответов


если этот метод используется для вызова процедуры хранилища, выполняющей Обновить / вставить в таблицу метод return -1 если сохраненный procudere имеет значение SET NOCOUNT в ON.

--источник


От Microsoft:

для инструкций UPDATE, INSERT и DELETE возвращаемое значение-это количество строк, затронутых командой. Если триггер существует в вставляемой или обновляемой таблице, возвращаемое значение включает число строк, затронутых операцией вставки или обновления, и число строк, затронутых триггером или триггерами. Для всех других типов операторов возвращаемое значение равно -1. Если происходит откат, возвращаемое значение также -1.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

Вы, наверное, уже -1, потому что вы используете хранимую процедуру, а не прямое изменение таблицы


какое значение вы возвращаете из своей хранимой процедуры? Можете ли вы показать код для хранимой процедуры. Вероятно, вам нужно отредактировать хранимую процедуру, чтобы вернуть требуемое значение, или хранимая процедура возвращает значение -1 либо специально, либо переменная, возвращаемая хранимой процедурой, имеет значение -1.


получить количество строк вывода из хранимой процедуры используя что-то вроде @rowCount=@@Rowcount. В DAL используйте dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount); затем в последних строках вы получите as (int)dbManager.GetParameterValue("RowCount").