Возвращаемое значение с помощью SqlCommand - PullRequest
6 голосов
/ 24 марта 2011

Я пытаюсь получить набор результатов и вернуть значение сохраненного процесса на сервере SQL 2008.Когда я запускаю proc в sql management studio, я получаю набор результатов и возвращаемое значение.

Однако, когда я пытаюсь получить значение в C # 4.0, значение параметра равно нулю.Вот мой код C #:

using (ConnectionManager<SqlConnection> cn = ConnectionManager<SqlConnection>.GetManager(CultureInfo.CurrentCulture.Name))
{
    using (SqlCommand cm = cn.Connection.CreateCommand())
    {
        cm.CommandText = "Name of proc here";
        cm.CommandType = CommandType.StoredProcedure;

        cm.Parameters.AddWithValue("@ApplicationId", ApplicationId);                                        
        cm.Parameters.AddWithValue("@Index", Index);

        if (PageSize > 0)
            cm.Parameters.AddWithValue("@PageSize", PageSize);

        cm.Parameters.Add("@ReturnValue", SqlDbType.Int);
        cm.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue;

        using (IDataReader dr = cm.ExecuteReader())
        {
            SafeDataReader sdr = new SafeDataReader(dr);
            while (sdr.Read())
            {
                UserApplicationEntity uae = new UserApplicationEntity();
                uae.UserId = sdr.GetGuid("UserId");
                uae.ExternalId = sdr.GetString("ExternalId");
                Result.Value.Collection.Add(uae);
            }

            Result.Value.TotalResults = (int)cm.Parameters["@ReturnValue"].Value;
        }
    }
}

Последняя строка, где я вызываю Result.Value.TotalResults = (int) cm.Parameters ["@ ReturnValue"]. Value;где значение равно нулю.В каждом уроке или посте, которые я нашел, я, кажется, все делаю правильно.На данный момент я думаю, что мне просто не хватает чего-то маленького, и мне нужен еще один набор глаз.Я также пытался установить параметр возврата раньше всех остальных, поскольку в одном сообщении, которое я нашел на сайте MS, говорилось, что мне нужно, но независимо от того, где он находится, он возвращает ноль.

1 Ответ

7 голосов
/ 24 марта 2011

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

Что делает класс SafeDataReader?Возможно ли, что он предотвращает чтение всего набора результатов?

Попробуйте переместить код, который читает возвращаемое значение, за пределы блока using для устройства чтения данных.Это может помочь продвинуть ответ за пределы результирующего набора, чтобы получить возвращаемое значение.

...