F#获取数据库表数据

时间:2016-10-03 13:53:51

标签: sql f#

我试图从Azure SQL Server获取数据。我已经能够通过这种方法获得数据:

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)

但是我得到了这个错误:&#34;根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。&#34;

2 个答案:

答案 0 :(得分: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 :(得分:0)

这是一种方法(使用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。它还可以轻松地从表中选择所有数据。