2017-04-06 44 views
1

我試圖從SQL Server 2008 R2上的存儲過程返回數據。 (該存儲過程不與Microsoft.FSharp.Data.TypeProviders發揮很好,我浪費了大半個上午的下降this seemingly futile pathF#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類型,我無法弄清楚如何downcast到適當的類型。

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

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

從下面的代碼,我可以告訴列。[1]有類型System.Int32。

table0.Columns.[1].DataType 

但是,如果我從該列中取第一個元素,我該如何向下轉換爲上面.DataType中指定的相同類型?這種失敗:

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

回答

4

一個轉換的目標類型必須是靜態已知的(它不能像你使用的是任意運行時表達式),所以你必須使用

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

一次你已經想出了這種類型。

+0

我明白了。我想我需要有一些列名稱的映射,以知道如何處理內容,所以也許不能通過無論如何動態下調獲得很多。 – Talmage