【问题标题】:Stored procedure returns nullable DateTime instead of a varchar存储过程返回可为空的 DateTime 而不是 varchar
【发布时间】:2020-07-22 18:07:40
【问题描述】:

我有一个问题,我在存储过程中将一列定义为 varchar,但是当我将它添加到我的 C# 程序时,EntityFramework 使用 DateTime 可为空的原始字段类型。我认为问题可能出在第二个 select 语句中,因为我使用相同的字段名称但不是 100% 确定。

存储过程:

SELECT
      1                                         AS [SORT]
      ,CONVERT(VARCHAR, t1.RecDate, 120)        AS [RecDate]
      ,t1.Program                               AS [Program]
      ,t1.Currency                              AS [CURRENCY]
      ,t1.SupplierName                          AS [SupplierName]
      ,t1.SupplierAccount                       AS [SupplierAccount]
      ,t1.RecStatus                             AS [RecStatus]
      ,t4.Type                                  AS [TYPE]
      ,CONVERT(VARCHAR, t1.Date, 120)           AS [PiDate]
      ,CONVERT(VARCHAR, t1.DiscountedDate, 120) AS [DiscountedDate]
      ,CONVERT(VARCHAR, t1.DueDate, 120)        AS [DueDate]                                
      ,t1.PaymentAmount                         AS [Payment]

FROM orb_RootRecords t1
LEFT JOIN orb_SupplierRecords t3 on t3.OrbianAccountId = t1.SupplierAccount
LEFT JOIN orb_AccountType t4 on t4.Id = t3.AccountTypeId
WHERE FLOOR(CAST(t1.RecDate as float)) = FLOOR(CAST(@runDate as float))
--ORDER BY [SORT], [Program]  ,[CURRENCY] ,[RecDate] ,[SupplierName] ,[SupplierAccount],[RecStatus] ,[TYPE],[PiDate] ,[DiscountedDate] ,[Payment]

UNION

SELECT 2 AS [SORT], [RecDate], Program AS [Program], [CURRENCY], null AS [SupplierName], null AS [SupplierAccount], null AS [RecStatus], null AS [TYPE], null AS [PiDate], null AS [DiscountedDate], null AS [DueDate]
,SUM (PaymentAmount) AS [Payment]
FROM orb_RootRecords t2
where FLOOR(CAST(t2.RecDate as float)) = FLOOR(CAST(@runDate as float))

Group by [RecDate], [Program], [CURRENCY]
ORDER BY  [RecDate], [Program], [CURRENCY], [Sort], [SupplierName], [SupplierAccount], [RecStatus], [TYPE], [PiDate], [DiscountedDate], [DueDate], [Payment]

EntityFramework 结果:

public partial class orb_rpt_reconciliation_report_Result
{
    public int SORT { get; set; }
    public Nullable<System.DateTime> RecDate { get; set; }
    public string Program { get; set; }
    public string CURRENCY { get; set; }
    public string SupplierName { get; set; }
    public string SupplierAccount { get; set; }
    public string RecStatus { get; set; }
    public string TYPE { get; set; }
    public string PiDate { get; set; }
    public string DiscountedDate { get; set; }
    public string DueDate { get; set; }
    public Nullable<decimal> Payment { get; set; }
}

我期待看到公共字符串 RecDate { get;放; } 而不是上面显示的内容。

【问题讨论】:

  • 我认为你必须与你对待RecDate的方式保持一致:要么总是转换为字符串,要么永远不要这样做。如果需要进行查询或比较“工作”,SQL Server 将更改数据类型。确保结果一致性的唯一方法是在你要求它做的事情上保持一致。
  • 假设您总是希望 RecDate 是一个字符串,而不是将 CONVERT(VARCHAR, t2.RecDate, 120) 放入您的 UNION 的第二个查询中?

标签: c# entity-framework stored-procedures


【解决方案1】:

基于两个 cmets - 将 [RecDate] 更改为 convert(varchar, t2.RecDate, 120) As [RecDate] 并且能够使输出类正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多