簡體   English   中英

存儲過程在 razor 頁中返回 null 值

[英]Stored procedures returning null value in razor pages

我有兩個將根據條件執行的存儲過程。

第一個存儲過程: AvailableHourSlots

CREATE PROCEDURE [dbo].[AvailableHourSlots] 
    @ActivityName nvarchar(max) ,
    @BookedDate datetime2(7)
AS  
    SELECT DISTINCT HourlyBasedTime 
    FROM ManageBooking AS mb, HourlyBased AS hb  
    WHERE bookingdate = @BookedDate 
      AND ActivityName = @ActivityName
      AND (SUBSTRING(HourlyBasedTime, 1, 2) <> SUBSTRING(mb.PreferredTimeslot, 1, 2))

第二個存儲過程: AvailableHalfAnHourSlots

CREATE PROCEDURE [dbo].[AvailableHalfAnHourSlots] 
    @ActivityName nvarchar(max) ,
    @BookedDate datetime2(7)
AS  
    SELECT DISTINCT hh.halfanhourtime
    FROM ManageBooking AS mb, Halfanhour hh
    WHERE bookingdate = @BookedDate
      AND ActivityName = @ActivityName 
      AND (SUBSTRING(hh.halfanhourtime, 1, 5) <> SUBSTRING(mb.PreferredTimeslot, 1, 5))
      AND (RIGHT(hh.halfanhourtime, 5) <> RIGHT(mb.PreferredTimeslot, 5))

Model是基於第一個存儲過程output創建的:

namespace ActivityBookingSystem.Models
{
    public class HourlyBasedView
    {
        public string HourlyBasedTime { get; set; }   
    }
}

ApplicationDbContext

protected override void OnModelCreating(ModelBuilder modelBuilder)
{            
    modelBuilder.Entity<NonOperatingDaysView>().HasNoKey();
    modelBuilder.Entity<AvailableOneHourSlots>().HasNoKey();
    modelBuilder.Entity<HourlyBasedView>().HasNoKey();

    //modelBuilder.Ignore<HourlyBasedView>(); //ignore create the table for the stored procedure
    //modelBuilder.Query<HourlyBasedView>();            
}

public DbSet<ActivityBookingSystem.Models.HourlyBasedView> HourlyBasedView { get; set; }

create.cshtml - Ajax 調用:

function GetAvailableSlots(e) {
        var rootPath = '@Url.Content("~")';
        alert("Hi");
        var ActivityList = document.getElementById("DrpDwnActivityList");
        var ActivityListValue = ActivityList.options[ActivityList.selectedIndex].value;
        var BookedDate = document.getElementById("DateBookedDate").value;
        
        $.ajax({
            type: "Get",
            url: rootPath + "/ManageBooking/Create?handler=GetAvailableSlots",
            headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
            data: { Duration: e.value,ActivityName:ActivityListValue,BookedDate:BookedDate },
            dataType: "json",
            success: function (result) {
                //console.log(result),  //just for debug
                //    $("#TrainingType").val(result.trainingType), //mind this should be lower-case letters by default setting
                //    $("#TrainingVersion").val(result.version),
                //    $("#SessionType").val(result.sessionType)
                alert(result);
            },
            error: function (data) {
                alert(data);
            }
        });
    }

create.cshtml.cs

public async Task<JsonResult> OnGetGetAvailableSlotsAsync(string ActivityName, string BookedDate, string Duration)
{
    Console.WriteLine(Duration);
    DateTime BookingDate = Convert.ToDateTime(BookedDate);
    ActivityName = ActivityName.ToString();
            
    if (Duration == "1 Hour")
    {
        var LstPreferredTimeSlot = _context.HourlyBasedView.FromSqlRaw("EXEC dbo.AvailableHourSlots @BookingDate = {0}, @ActivityName = {1}", BookingDate, ActivityName)
                    .AsNoTracking().ToList();

        // var PreferredTimeSlot = await _context.HourlyBasedView.FromSqlRaw($"SELECT distinct HourlyBasedTime  FROM   ManageBooking as mb, HourlyBased as hb  WHERE bookingdate = {BookingDate} and ActivityName = {ActivityName} and (substring(HourlyBasedTime,1,2) <> substring(mb.PreferredTimeslot,1,2))").ToListAsync();
    }

    return new JsonResult(LstPreferredTimeSlot);
}

存儲過程返回 null 值,我在 SQL Server Management Studio 中單獨執行查詢,它返回值。

任何幫助,將不勝感激!


編輯 create.cshtml.cs


if (Duration == "1 Hour")
            {
                var LstPreferredTimeSlot = _context.HourlyBasedView.FromSqlRaw("EXEC dbo.AvailableHourSlots @BookedDate = {0}, @ActivityName = {1}", BookingDate, ActivityName).
                    AsNoTracking().ToList();

                

                
            }

日期參數傳遞錯誤。 修正后的版本如下圖

if (Duration == "1 Hour")
{
  var LstPreferredTimeSlot = _context.HourlyBasedView.FromSqlRaw("EXEC dbo.AvailableHourSlots @BookedDate = {0}, @ActivityName = {1}", BookingDate, ActivityName).AsNoTracking().ToList();                    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM