2016-09-26 39 views
1

我正在處理2個數據庫,它們都包含相同的表,但數據中存在一些差異。F#獲取數據庫列名和數據類型

我想知道是否有辦法在SQL表中獲取列的名稱和數據類型,然後將每個和數據類型的名稱添加到列表中供以後分析。

+1

哪個數據庫? –

+0

兩者。說實話,我真的不需要寫第一句話,只是爲了一點上下文。 –

+0

SQL Server?甲骨文? MySQL?.. –

回答

3

你有三(四,如果你在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使用SQL查詢的一種方法(方法3):

#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 
+0

我如何使用方法1來做到這一點? –

+0

@JacksonSentzke這是一個很好的問題。之後我實際上考慮過編輯我的帖子,因爲我大膽宣稱可以用任何方式。我懷疑訪問SQL Server中的一些特殊的sprocs並不那麼容易,或者我不知道如何。 :-)所以你要麼執行一個類似的SQL語句,要麼希望某些API調用暴露必要的數據。爲什麼你喜歡這種方法有特別的理由嗎? – s952163

+0

這只是我做這個項目的方式。我只做了一個月左右的F#,而且目前爲止我只使用SQLDataConnection來獲取數據。 –

1

SQL服務器

EXEC sp_help將 '表名'

+2

我不能使用這個,我只能通過F#與數據庫交互。 –

+1

@JacksonSentzke:當然,您可以從F#調用存儲過程... – ildjarn

+0

不幸的是,對於此存儲過程,它不是直截了當的,因爲它返回兩個結果,即關於表的一般信息,然後返回列信息。 – s952163