2011-06-30 50 views
1

爲什麼SqlCommand的參數不承認

 scIns.Parameters.Add(new SqlParameter("@v30", 0.00m)); 

導致 「@ V30未定義」 錯誤,但

 decimal dZero = 0.00m; 
     scIns.Parameters.Add(new SqlParameter("@v30", dZero)); 

的作品好不好?

+3

您確定這是唯一的區別嗎?不管你是否使用中間變量... –

+2

你能告訴我們整個代碼片段嗎? –

+0

是的,提到的錯誤不在發佈的代碼中,但必須在其他地方 – Rahul

回答

3

SqlParamter有兩個參數兩個不同的過載,第一個是字符串,第二個是SqlDbType或對象。

在第一種情況下,當0.00m被傳入時,它被轉換爲Int64,而在第二種情況下,因爲傳入的值是十進制類型,所以它使用SqlDbType.Decimal。

看看這個Link

更新:
發現了另一個問題stackoverflow談到有關這一點,並有一個詳細的解答。 :)

+0

似乎C#的重載解析中有一個怪癖,我沒有意識到。任何數字類型的零字符都會匹配並隱式轉換爲任何'enum'類型(不論enum是否包含零值)。但是,其他值不會被轉換。 –

+0

我認爲有這樣的事情很有趣,我忙着通過System.Data與反射器試圖查看SqlParameter類是否進行任何轉換。感謝您的更新Matti! – Jethro

+0

+1,很好看...... –

1

如果你看看調試器,你會發現在第一種情況下,參數的DbType是Int64,在第二種情況下,它是Decimal。

嘗試使用其中一個SqlParameter ctor重載,您明確指定SqlDbType。

希望幫助,

約翰

+0

這怎麼會發生?在這兩種情況下,構造函數都傳遞完全相同的值。 –

+0

謝謝。我想我知道發生了什麼,以及如何解決它,但似乎比原來的解決方法更麻煩。我也遇到了「」的對象值問題。 – SeaDrive

+0

據我所知,JohnD指出的是,接受(string,object)參數的構造函數基本上猜測對象的類型。不知何故,小數點0.00m被改爲int(通過C#或SqlServer?),所以SqlCommand需要一個int,並拒絕了一個小數。顯然,使用類型變量可以避免這個問題。你也可以使用其他構造函數來傳遞SqlDBType作爲單獨的參數。 – SeaDrive