F# 获取数据库列名和数据类型

F# Get Database column names and data types

我正在使用 2 个数据库,它们都包含相同的 table,但数据存在一些差异。

我想知道是否有办法获取 sql table 中列的名称和数据类型,然后将每个列的名称和数据类型添加到列表中供以后使用分析。

SQL 服务器

执行 sp_help 'tablename'

您有三个(如果您输入 ADO.NET,则有四个)选项来访问您的数据库:

  1. 库存 SQLDataConnection Type Provider 随 F# 3 一起提供,可与 SQLServer 一起使用。它适用于 SQLServer,如果您更喜欢使用 LINQ,这是一种访问它的简便方法。
  2. 一个更新的、多功能的 SqlDataProvider Type Provider,适用于各种数据库。如果您的数据库不是 SQLServer,则这是要使用的类型提供程序。
  3. 还有 SqlClient Type Provider 可以让您访问类型安全 SQL。如果您在 SQLServer 上并且精通 T-SQL,这就是您要走的路。

您可以同时使用这三个来获取相关数据。这是通过 SqlCommandProvider(方法 3)使用 SQL 查询的一种方法:

#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.mdf;Integrated Security=True;Connect Timeout=10"    

let cmd = new SqlCommandProvider<"select * from Information_schema.Columns where table_name = @tableName",connectionString>(connectionString)
let out = cmd.Execute(tableName="yourTableName")
out
    |> Seq.map (fun x -> (x.COLUMN_NAME,x.DATA_TYPE)) 
    |> Seq.toList

val it : (Option * Option) list = [(Some "AutoUpdated", Some "bigint"); (Some "UpdatedDate", Some "datetime"); (Some "DataDate", Some "datetime"); (Some "RandomStuff", Some "float"); ...]

如果您想摆脱选项类型,可以使用 x.COLUMN_NAME.Value

获取数据库中的所有表(这与服务器上的所有表不同)。您只需要将 DB_NAME 替换为您的数据库名称(或者如果它是 localdb,您可以跳过):

let cmd2 = new SqlCommandProvider<"select TABLE_NAME from [DB_NAME].Information_Schema.Tables where table_type = 'BASE TABLE'",connectionString>(connectionString)
let out2 = cmd2.Execute()
out2 |> Seq.toList