F#向下转换DataTable的元素

时间:2017-04-06 23:32:24

标签: datatable f# downcast

我正在尝试从SQL Server 2008 R2上的存储过程返回数据。 (存储过程与Microsoft.FSharp.Data.TypeProviders不能很好地兼容,我早上大部分时间都在this seemingly futile path上去了。)

所以我从以下代码中获得了一系列表:

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,有些是float。

我认为很容易做一些嵌套循环或者.Map或.Iter函数迭代所有行和列并将值存储到正确的列数组。 (如果有更好的方法可以做到这一点 - 我觉得应该有 - 任何建议都值得赞赏!)

但返回的值是obj类型,我无法弄清楚如何向下转换为正确的类型。

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

1 个答案:

答案 0 :(得分:4)

强制转型的目标类型必须是静态已知的(它不能像您一样使用任意运行时表达式),因此您必须使用

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

一旦你弄明白了这个类型。