MVC C# Количество записей на основе условия - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь подсчитать и отобразить количество журналов, которые ведут различные пользователи из раздела администратора. У каждого пользователя есть идентификатор пользователя, и с его помощью я хотел бы подсчитывать и отображать данные из определенной таблицы c. Я сделал из хранимой процедуры и передал ее в контроллер через ViewBag, но он продолжает возвращать 1 в качестве суммы для всех значений. Процедура ниже

CREATE proc [Usp_GetCallCountByUserID]
@UserID int output
AS
BEGIN
SELECT COUNT (*) FROM Customer Where UserID= @UserID
GROUP BY UserID
set @UserID =@@ROWCOUNT
END
GO

Контроллер:

     public ActionResult Index()
       {
        con.Open();
        SqlCommand comm = new SqlCommand("Usp_GetCallCountByUserID", con);
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.Add("@UserID", SqlDbType.Int).Direction =
            ParameterDirection.Output;
        SqlDataReader reader;
        reader = comm.ExecuteReader();
        reader.Close();
        ViewBag.CountLog = comm.Parameters["@UserID"].Value.ToString();
        con.Close();

        var callCustomers = db.Registrations;
        return View(callCustomers.ToList());
    }

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Изменить: ответ отредактирован после уточнения

Если я прав, вы бы сделали что-то вроде этого:

CREATE proc [Usp_GetCallCountByUserID]
  @UserId int
  @TotalCount int output
AS
BEGIN
  SELECT @TotalCount = COUNT(*) FROM Customer WHERE UserId = @UserId
END

Пожалуйста, измените код вызова c# соответственно , Вы не нуждаетесь в предложении GROUP BY, если группируете по тому же полю, по которому вы фильтруете.

Замечание: IMO хранимая процедура является избыточной для такой простой задачи и не дает каких-либо ощутимых улучшений производительности, особенно если ваше приложение и сервер БД всегда включены (оба оптимизируют выполнение запроса, если оно будет повторено). Когда запросы настолько просты, я бы предпочел выполнить CommandType.Text DbCommand:

conn.Open();
using (var cmd = conn.CreateCommand())
{
   cmd.CommandType = CommandType.Text;
   cmd.CommandText = "SELECT Count(*) FROM Customer where UserId = @UserId";
   cmd.Parameters.Add("@UserId", SqlDbType.Int).Value = currentUserId;
   using (var reader = cmd.ExecuteReader())
   {
      reader.Read(); // Advance one record
      ViewBag.CountLog = reader.GetInt32(0);
   }
}

Наконец, поскольку вы, похоже, используете какой-то ORM (Entity Framework?), Почему бы просто:

db.Customers.Count(c => c.UserId == currentUserId);

Это в значительной степени эквивалентно приведенному выше коду.

0 голосов
/ 20 февраля 2020

Не используйте глобальную переменную @@ ROWCOUNT

Вы должны сохранить значение COUNT (*) в своем запросе, посмотрите код ниже,

CREATE proc [Usp_GetCallCountByUserID]
    @UserID int,
    @RowCount int output 
    AS
    BEGIN
    SELECT @RowCount = COUNT (*) FROM Customer Where UserID= @UserID
    GROUP BY UserID
    END
    GO
0 голосов
/ 20 февраля 2020

Прежде всего ваша хранимая процедура работает точно так, как ожидалось, поскольку @@ROWCOUNT возвращает количество строк в результате.

Вы должны записать свой результат в другую переменную, как показано ниже.

Для вашей хранимой процедуры



DECLARE @Result INT
SELECT  @Result = COUNT (*) FROM Customer Where UserID= @UserID
GROUP BY UserID

А затем прочитайте это значение;)

И изменения для вашего кода

reader.Close();
ViewBag.CountLog = comm.Parameters["@Result"].Value.ToString();
con.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...