2017-04-06 8 views
1

SQL Server 2008 R2のストアドプロシージャからデータを返そうとしています。 (ストアドプロシージャはMicrosoft.FSharp.Data.TypeProvidersとうまく再生できませんでしたし、私はダウンthis seemingly futile path行く朝のほとんどを無駄にした。)F#DataTableの要素をダウンキャスト

をだから私は、次のコードからテーブルの列を取得する:

open System.Data 
open System.Data.SqlClient 

let connString = @"Data Source=someserver;Initial Catalog=somedb;Integrated Security=True" 
let conn = new SqlConnection(connString) 

let GetTables spName baseTableName = 
    use comm = new SqlCommand(spName, conn, CommandType=CommandType.StoredProcedure) 
    comm.CommandTimeout <- 90 
    comm.Parameters.AddWithValue("@TableName", baseTableName) |> ignore 
    use adapter = new SqlDataAdapter(comm) 
    use dataSet = new DataSet() 
    adapter.Fill(dataSet) |> ignore 
    dataSet.Tables |> Seq.cast<DataTable> 

let tableSeq = GetTables @"dbo.uspGetPremium" "0123_Premium_99" 

最終的には、各列を別々の配列(またはリストまたは配列)に抽出したいと考えています。いくつかの列は文字列であり、いくつかはintであり、いくつかは浮動小数点です。

ネストされたループや、.Mapや.Iter関数を使ってすべての行と列を繰り返し処理し、その値を適切な列配列に格納するのは簡単だと思いました。 (これを行うより良い方法があれば - 私はそこにいるように感じる - 任意の提案は高く評価されています!)

しかし、返される値はobj型のものです。適切なタイプ。

let table0 = tableSeq |> Seq.item 0 
table0.Rows.[0].[1];; 

val table0 : DataTable = Table 
val it : obj = 134 

以下のコードから、私はColumns [1]タイプはSystem.Int32です。

table0.Columns.[1].DataType 

しかし、私はその列から最初の要素を取る場合、どのように私は上記の.DataTypeで指定された同じタイプにダウンキャストすることができますか?これは失敗します。

table0.Rows.[0].[1] :?> table0.Columns.[1].DataType 

答えて

4

キャストのターゲット・タイプは、静的に(あなたが使用しているように、それは任意実行時の式にはできません)を知らなければならないので、あなたは

一度
table0.Rows.[0].[1] :?> int 

を使用する必要がありますあなたはそのタイプを理解しました。

+0

です。とにかくコンテンツと何をするべきかを知るためには、カラム名のマッピングをいくつか用意する必要があるでしょう。おそらく、とにかく動的にダウンキャストできれば、それほど多くは得られませんでした。 – Talmage

関連する問題