2009-06-02 5 views
0

F#のDbCommand.ExecuteScalarはどのように使用できますか?私はintに変換する必要がobjを返します。私はF#にはとても新しく、キャスティングをする必要はないとはっきりしていません。F#とExecuteScalarキャスト

let (stockid:uint32) = command.ExecuteScalar() 

Compile Error: 
Type constraint mismatch. The type obj is not compatible with type uint32 

アップキャスティングを使用して:?>ランタイムエラーがスローされます。

+1

Convert.ToInt32(...)はほとんどすべての入力で動作するため、簡単に呼び出せますか? – sisve

答えて

4

あなたはちょうどあなたが何を得るのですか?

let o : obj = ... 
printfn "%s" (o.GetType().ToString()) 

を言うならそれは本当にintですか? (int32またはuint32または何ですか?)

?>演算子は正しいダウンキャスト演算子ですが、一致する型が必要です。実際の型にキャストした後、ある整数型から別の型に変換する必要がある場合は、目的の型に対応する関数を使用します。

let x : int = int myUnsignedInt 
// first 'int' is type, second is function to convert-to-int 
+0

それがint32だと仮定すると、オブジェクト - > uint32をキャストする正しい方法は何ですか? C#のオブジェクト - > int32(essentiall unbox) - > uint32の経路に行くのですか、それともF#にもっと慣用的な方法がありますか? – JaredPar

+0

ExecuteScalarがint64を返していたことが判明しました。タイプが一致したら、すべてが機能しました。何が起こっていたの詳細な答えと説明をありがとう。 – MikeW

0

意気消沈した場合(:?>)を使用して、実行スカラからの戻り値としてunit32を取得していない、実行時にスローされます。

let stockid : uint32 = unit32 command.ExecuteStalar() 

しかし、あなたがuint32に変換できないものを取得している場合は、それも失敗します。 More on casting and converting here

0

uint32の代わりにint32にキャストしてみてください。 ExecuteScalarはint32のオブジェクトを返します。

関連する問題