我有一個SQL Server數據庫,我的MVC應用程序可以通過實體框架6訪問。我有一個存儲過程,它執行一些總計並將其存儲在臨時表中,然後返回結果通過最後的select語句(簡體版):SQL Server ISNULL和實體框架存儲過程
select isnull(TotalDataShared, 0) as TotalDataShared from #main;
有跡象表明,TotalDataShared可以爲空的情況下,所以我要檢查它。對於PROC結果自動生成的EF實體看起來是這樣的(也簡化):
public partial class getUsageTotals_Result
{
public decimal TotalDataShared { get; set; }
}
我的回購方法調用這樣的PROC:
public UsageTotals GetCurrentUsage(int accountId)
{
var ret = _context.getUsageTotals(accountId).First();
return new UsageTotals {
DataShared = (double)ret.TotalDataShared
};
}
當#main TotalDataShared不爲空一切工作正常。當它是空的,我讓我的應用程序出現以下錯誤:
上「getUsageTotals_Result」的「TotalDataShared」屬性不能 設定爲'System.Double的價值。您必須將此屬性設置爲類型爲'System.Decimal'的非空值 。
在我看來,它忽略了ISNULL命令。我已經嘗試了將最後一個選擇包裝在表var中,因爲我以前在EF中有臨時表中的數據返回問題,但是沒有任何好處。
我也嘗試使用COALESCE(),它給出了相同的結果。我也嘗試刪除並重新創建在EF中的對象,無濟於事。我也嘗試返回非零浮點值,如果它爲空(ISNULL(TotalDataShared,4.441)),但也不會改變任何東西。
不知道接下來要嘗試什麼。有任何想法嗎?
UPDATE: 添加存儲過程骨架:
create proc getUsageTotals @accountid int
as
if object_id('tempdb..#main') is not null drop table #main;
create table #main (
TotalDataShared float,
)
. . .
. . .
select isnull(TotalDataShared, 4.441) as TotalDataShared from #main;
go
最後兩個PROC的線是選擇和「走出去」,因此,返回值應該是select語句,除非我失去了一些東西。
您能否顯示過程代碼? –
我加了sproc骨架。這是一個簡單的過程,通常的內部連接可以獲得總計並將其插入臨時表中。然後顯示最終選擇。 – Ben
'isnull'返回第一個參數的數據類型。這是'float'映射到'C#'中的double。你爲什麼將它定義爲'decimal'?程序中是否有任何條件邏輯?或者是從早期版本的proc推斷的元數據? –