Почему Database.SqlQuery возвращает 0 строк? - PullRequest
0 голосов
/ 15 апреля 2019

Я использовал это

        public List<InspectionReport> GetInspectionReportDetails(int InspectionReportID)
        {
            var List= this.Database.SqlQuery<InspectionReport>("GetInspectionReportDetails", InspectionReportID).ToList();

            return List;
        }

в классе, который унаследован от DbContext

Я вызываю эту функцию в контроллере, но список пуст. Database.SqlQuery возвращает 0 элементов, даже если процедура возвращает данные для параметра, который я предоставляю функции, но не для этого.

Обновление:

alter PROCEDURE GetInspectionReportDetails 

    @InspectionReportID int=0

AS
BEGIN

    Select ir.InspectionReportID
          ,ir.VelosiProjectNo
          ,ir.VelosiReportNo   
          ,ir.Reference
          ,ir.PoNo
          ,ir.InspectionDate
          ,ir.IssueDate
          ,ir.InspectionPhase
          ,ir.InServiceInspection
          ,ir.NewInduction
          ,ir.HydrostaticTest
          ,ir.DimensionalCheck
          ,ir.ThicknessCheck
          ,ir.Patrom
          ,ir.Gvs
          ,ir.FinalOgraInspection
          ,ir.OmcClientRequirement
          ,ir.TankLorryRegistrationNo
          ,ir.TruckTractorManufacturerName
          ,ir.ClientName
          ,ir.Capacity
          ,ir.Omc
          ,ir.EngineNo
          ,ir.TankLorryDimension
          ,ir.ChassisNo
          ,ir.InspectionPlace
          ,ir.TankLorryEnginePower
          ,ir.CarriageName
          ,ir.Brakes
          ,ir.IsSatisfactory
          ,ir.Remarks
          ,ir.Rev
          ,ir.Description
          ,ir.Status
          ,u1.UserName as PeparedBy
          ,u2.UserName as CheckedBy
          ,u3.UserName as ApprovedBy
          ,u4.UserName as IssuedBy
      From InspectionReport ir
      Inner Join dbo.[User] u1
      ON u1.UserID= ir.PeparedBy
      Inner Join dbo.[User] u2
      ON u2.UserID= ir.CheckedBy
      Inner Join dbo.[User] u3
      ON u3.UserID= ir.ApprovedBy
      Inner Join dbo.[User] u4
      ON u4.UserID= ir.IssuedBy

      where ir.InspectionReportID= @InspectionReportID

Это хранимая процедура, которая вызывается функцией.

Это класс inpsectionreport;

namespace VAILCertificates.DAL.Entities
{
    public class InspectionReport
    {
        //General Details
        public int InspectionReportID { get; set; }

        [Required]
        [Display (Name= "Velosi Project No")]
        public string VelosiProjectNo { get; set; }

        [Display(Name = "Velosi Report No")]
        public string VelosiReportNo { get; set; }

        [Required]
        public string Reference { get; set; }

        [Required]
        [Display(Name = "PO No")]
        public string PoNo { get; set; }

        [Required]
        [Display(Name = "Inspection Date")]
        public DateTime InspectionDate { get; set; }

        [Required]
        [Display(Name = "Issue Date")]
        public DateTime IssueDate { get; set; }

        //Inspection Phase
        [Required]
        [Display(Name = "Inspection Phase")]
        public byte InspectionPhase { get; set; } //0= Before, 1= During, 2= Final

        //Types Of Inspection
        [Display(Name = "In Service Inspection")]
        public bool InServiceInspection { get; set; }

        [Display(Name = "New Induction")]
        public bool NewInduction { get; set; }

        [Display(Name = "Hydorstatic Test")]
        public bool HydrostaticTest { get; set; }

        [Display(Name = "Dimensional Check")]
        public bool DimensionalCheck { get; set; }

        [Display(Name = "Thickness Check")]
        public bool ThicknessCheck { get; set; }

        [Display(Name = "PATROM")]
        public bool Patrom { get; set; }

        [Display(Name = "GVS")]
        public bool Gvs { get; set; }

        [Display(Name = "Final OGRA Inspection")]
        public bool FinalOgraInspection { get; set; }

        [Display(Name = "OMC/Client Requirement")]
        public bool OmcClientRequirement { get; set; }

        //Details Of Tank Lorry

        [Required]
        [Display(Name = "Tank Lorry Registration Number")]
        public string TankLorryRegistrationNo { get; set; }

        [Required]
        [Display(Name = "Truck Tractor Manufacturer Name")]
        public string TruckTractorManufacturerName { get; set; }

        [Required]
        [Display(Name = "Client Name")]
        public string ClientName { get; set; }

        [Required]
        [Display(Name = "Capacity")]
        public string Capacity { get; set; }

        [Required]
        [Display(Name = "OMC")]
        public string Omc { get; set; }

        [Required]
        [Display(Name = "Engine No")]
        public string EngineNo { get; set; }

        [Required]
        [Display(Name = "Tank Lorry Dimension")]
        public string TankLorryDimension { get; set; }

        [Required]
        [Display(Name = "Chassis Number")]
        public string ChassisNo { get; set; }

        [Required]
        [Display(Name = "Inspection Place")]
        public string InspectionPlace { get; set; }

        [Required]
        [Display(Name = "Tank Lorry (Engine Power)")]
        public string TankLorryEnginePower { get; set; }

        [Required]
        [Display(Name = "Carriage Name")]
        public string CarriageName { get; set; }

        [Required]
        public string Brakes { get; set; }

        //ResultsofInspection

        [Required]
        [Display(Name = "Is Satisfactory?")]
        public bool IsSatisfactory { get; set; }

        //Remarks
        [Required]
        public string Remarks { get; set; }

        //ApprovalSection

        public string Rev { get; set; }

        [Required]
        public string Description { get; set; }

        [Required]
        public int PeparedBy { get; set; }

        public int CheckedBy { get; set; }
        public int ApprovedBy { get; set; }

        public int IssuedBy { get; set; }

        //ReportStatus

        public byte Status { get; set; } //0= Prepared 1= CheckedBy 2= ApprovedBy

    }
}

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Вы также можете создать DbParameter и предоставить его в качестве значения параметра для вашей хранимой процедуры:

var InspectionReportID= new SqlParameter("@InspectionReportID", 0);

var list = this.Database.SqlQuery<InspectionReport>("EXECUTE dbo.GetInspectionReportDetails @InspectionReportID",InspectionReportID).ToList();

Важно параметризовать любой пользовательский ввод для защиты от атаки SQL-инъекцией.Вы можете включить заполнители параметров в строку запроса SQL, а затем предоставить значения параметров в качестве дополнительных аргументов.Любые введенные вами значения параметров будут автоматически преобразованы в DbParameter.

0 голосов
/ 15 апреля 2019

Попробуйте использовать этот код:

public List<InspectionReport> GetInspectionReportDetails(int InspectionReportID)
{
    var List= this.Database.SqlQuery<InspectionReport>("GetInspectionReportDetails @InspectionReportID", InspectionReportID).ToList();
    return List;
}
0 голосов
/ 15 апреля 2019

Попробуйте изменить оператор SQL, я чувствую, что ошибка в том, как вы вызываете оператор SQL.

var list = this.Database.SqlQuery<InspectionReport>($"EXEC GetInspectionReportDetails {InspectionReportID}").ToList();

...