2017-04-06 11 views
1

SQL Server 2008 R2의 저장된 proc에서 데이터를 반환하려고합니다. (저장된 시저는 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이며 일부는 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] :?> int 

번을 사용 그래서

이 캐스트의 대상 유형이 정적으로 알고 있어야
table0.Rows.[0].[1] :?> table0.Columns.[1].DataType 

답변

4

, (당신이 사용하고있는 것처럼 임의의 런타임 표현 될 수 없음) 형을 알아 냈어.

+0

나는 본다. 나는 어쨌든 어쨌든 동적 인 다운 캐스팅을 할 수있게 됨으로써 얻을 수있는 것이 없을 것 같은 내용으로 무엇을해야 하는지를 알기 위해 어쨌든 컬럼 이름을 매핑해야 할 필요가 있다고 생각한다. – Talmage