2016-10-03 8 views
1

私はAzure SQL Serverからデータを取得しようとしています。私はこの方法でデータを得ることができました:F#データベーステーブルのデータを取得

let db = dbSchema.GetDataContext() 
    let serviceType = db.table 
    serviceType 

次に、実際のデータを取得するタイプキャスティングを行います。しかし、私のプログラムが進歩するにつれ、私は新しい方法でデータを入手する必要があります。

私は、コードのこの部分での列名のリストを取得することができるよ:

let columnList = (new SqlCommandProvider<"select * from Information_schema.Columns where table_name = @tableName",connectionString).Execute(tableName) 

データを取得するために、同様の方法があります場合、私は思ったんだけど。

私が試した:

let data = (new SqlCommandProvider<"select * from @tableName",connectionstring).Execute(tableName) 

をしかし、私はこのエラーを取得する:「不定型のオブジェクトの参照が前に、このプログラムのポイントに情報に基づいて、型注釈を前に、このプログラムのポイントに必要な場合があります。オブジェクトのタイプを制約するため、ルックアップが解決される可能性があります。

+0

2番目の例は役立ちます:http://fsprojects.github.io/FSharp.Data.SqlClient/ – s952163

+0

確率プロバイダー? –

+0

いいえ、SqlCommandProvider – s952163

答えて

2

私はこれを思いついた。

let GetData (tableName : string) = 
    let cn = new SqlConnection(connectionstring) 
    cn.Open() 
    let sQL = "select * from [" + tableName + "]" 
    let db = new SqlCommand(sQL, cn) 
    db.ExecuteReader() 

ここからデータにアクセスできます。だから、その変数にdb.ExecuteReaderを()を割り当てる...

let dataSource = db.ExecuteReader() 
let mutable tableData = List.empty 

while dataSource.Read() do 
    let rowLength = dataSource.FieldCount 
    let rowData = Array.zeroCreate(rowLength) 

    for i = 0 to dataSource.FieldCount-1 do 
     rowData.SetValue(dataSource.GetValue(i),i) 

    tableData <- rowData :: tableData 

tableData |> List.toArray 

これは、テーブル内のすべての値

1

を返しますこれは、テーブルからすべてのデータを選択するための一つの方法(SqlClient type providerを使用して)です。あなたのテーブルが大きすぎる場合、それは多くを返すでしょう。だから私はトップ1000の行を選択するだけです。 tablennをあなたの選択したテーブル名に置き換えます。列をパラメータ化できますが、テーブル名自体をパラメータとして指定する必要がある場合は、Tableをパラメータとして使用するストアドプロシージャ(または他の型プロバイダの引用符を使用する)を使用する必要があります。

しかし、これは文字列なので、構築が非常に簡単です。それではまた、それは文字通りでなければなりません。

#r @"..\packages\FSharp.Data.SqlClient.1.8.2\lib\net40\FSharp.Data.SqlClient.dll" 

open FSharp.Data 
open System 

[<Literal>] 
let connectionString = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=C:\Users\userName\Documents\Test.sdf.mdf;Integrated Security=True;Connect Timeout=10" 

[<Literal>] 
let tblnn = "MyBigTable" 

[<Literal>] 
let qry = "SELECT TOP 1000 * FROM " + tblnn 

let cmd = new SqlCommandProvider<qry, connectionString>(connectionString) 
cmd.Execute() |> Seq.toArray 

SqlDataConnection type providerもご利用いただけます。また、テーブルからすべてのデータを簡単に選択することもできます。

+0

それは動作しますが、私のプログラムの構造上、リテラルを使用することができなくなります。リテラルを削除すると、このエラーが再び発生します:「このプログラムポイントより前の情報に基づいて不定型のオブジェクトを検索します。オブジェクトの種類を制約するために、このプログラムポイントの前に型注釈が必要な場合があります。これにより、ルックアップが解決される可能性があります。 –

+0

残念ながら私はあなたのプログラムの構造には興味がありませんが、あなたが正しく理解していれば、tablenameをパラメータにしたいのですか? – s952163

関連する問題