2010-06-30 60 views
3

我有一個方法,可以添加或更新DB(SQL Server)中的記錄,並且它將RecordID作爲(Int32)輸出參數,並將成功/失敗結果作爲(Int32)返回值返回。爲什麼我必須爲SQL查詢轉換返回參數值?

鑑於我指定了這些參數的類型,爲什麼我們必須在返回時施放它們?

我希望用下面的:

enquiryID = cmd.Parameters["@EnquiryID"].Value; 

...但我最多有通過對額外的箍跳:

enquiryID = Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString()); 

這不是世界末日,但它看起來像是一個長期的解決方案。爲什麼Parameters.Value返回一個SqlParameters.Value對象而不是Int32?

UPDATE:

OK,我相信 - 直接鑄造FTW:(int)cmd.Parameters["@EnquiryID"].Value

回答

5

SQL Server不指定數據它返回的類型,所以C#有沒有辦法來推斷處理之前的類型它。此外,SqlParamater是泛化的,所以它傳遞和從SQL Server對象。 SQL Server在其最後執行強制轉換。

此外,如果您知道它始終是一個整數,您可以直接執行(int)cmd.Parameters["@EnquiryID"].Value,而不是使用Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString())。如果該值可能爲空返回,然後你可以添加

object value = cmd.Parameters["@EnquiryID"].Value; 
if(!value.Equals(DBNull.Value) 
    enquiryID = (int)value; 
+2

這可能最終成爲最好一堆if語句 'int值= value.Equals(DBNull.Value )? null:(int)value'而不是null你可以把一個默認值作爲 – 2010-06-30 12:00:12

+0

Re:sql server正在執行cast - 是的,這是有道理的。僅供參考,價值永遠不會爲空,但問題(和你的例子)值得注意。謝謝 – CJM 2010-06-30 12:03:15

+0

@Chris T:我總是忘記了?操作員,因爲我很少使用它,謝謝! – 2010-06-30 12:19:54

2

一個的SqlParameter對象的Value屬性的類型爲object,這意味着它可以返回任何給定類型。

你返回實際值的方式是錯誤的,你不應該爲了解析int32而轉換爲字符串。什麼是價值屬性爲你的價值只是一個盒裝版本,因此這應該足夠了:

enquiryID = (int)cmd.Parameters["@EnquiryID"].Value; 
+0

我的方式並不是真正的「錯誤」 - 畢竟,它是有效的,但是直接投射方法好得多。謝謝 – CJM 2010-06-30 12:00:13

相關問題