我试图从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;
答案 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。它还可以轻松地从表中选择所有数据。