2016-10-03 71 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

第二個示例應該有所幫助: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。您可以參數化列,但是如果您需要將表名稱本身作爲參數,則可能需要使用以表格作爲參數的存儲過程(或在其他類型提供程序中使用引號)。

但是,這是一個字符串,因此構建它非常容易。然後再一次,它必須是一個文字。

#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