2017-07-25 41 views
0

我一直在尋找答案,找不到它,真的很奇怪。C#LINQ ObjectParameter將STP輸出轉換爲SQL數據類型

我有SQL作爲smallint返回輸出參數的存儲過程。

ALTER PROCEDURE [STP_NAME] 
@Out_Error_Level Smallint OUTPUT 
SELECT @Out_Error_Level = 0 

很簡單,當我通過SQL管理工作室執行完美的作品。

現在有什麼奇怪的是,當我執行通過C#鏈接我得到'Bigint'。 C#代碼也很簡單:

DS_RAS_CD_APPEntities2 db = new DS_RAS_CD_APPEntities2(); 
ObjectParameter outputError = new ObjectParameter("Out_Error_Level", SqlDbType.SmallInt); 
var updateProcessesList2 = db.STP_NAME(outputError); 
Console.WriteLine(outputError.Value); 

結果是:BigInt。 enter image description here

現在,當我在sql中將輸出更改爲不同的數字時,我得到某種數據類型,例如:1返回二進制,2返回位,3返回Char,10返回Nchar。

它結束時我設置@Out_Error_Level = 35,則結果爲35.

任何幫助?

回答

1

如果你看一下構造函數ObjectParameter你會看到有兩個重載:

ObjectParameter(String name, Object value) 
ObjectParameter(String name, Type type) 

如果你看看你所提供的第二個參數是什麼話,就不是一個類型,所以必須使用第一次過載。

如果我們再看看它說什麼關於第二個重載:參數的System.Object的
初始值(和本質,類型):

價值
類型。

因此,大家可以看到它正在爲默認值,你已經通過了值(SqlDbType.SmallInt),並以此來制定出類型的對象應該是 - 在這種情況下,當然枚舉SqlDbType的。所以你傳回的每一個數字都被翻譯成它的enum等價物。一旦你提供了不存在於枚舉中的數字,它只會返回數字本身。

你可能想要做什麼是

new ObjectParameter("Out_Error_Level", typeof(Int16)); 

我使用Int16,因爲這是數據庫SMALLINT相當。你可以同樣使用更常見的Int32,我希望它能正常工作。

資料來源:https://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.objectparameter.objectparameter(v=vs.113).aspx

總之,如果你得到錯誤的結果的話,我會建議一直在尋找你規定的對象和方法,您正在使用的文件,確保您不會做關於它是如何工作的任何錯誤假設...

+0

謝謝你,這麼簡單。 – Orenger

相關問題