2016-09-26 3 views
1

Я работаю с 2 базами данных, оба содержат одни и те же таблицы, но есть некоторые отличия в данных.F # Получить имена столбцов базы данных и типы данных

Мне интересно, есть ли способ получить имена и типы данных столбцов в таблице sql, а затем добавить имена каждого и типы данных в список для последующего анализа.

+1

Какая база данных? –

+0

Оба. Честно говоря, мне не нужно было писать это первое предложение, это было просто для небольшого контекста. –

+0

SQL Server? Oracle? 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, это путь.

Вы можете использовать все три, чтобы получить соответствующие данные. Вот один из способов с помощью запроса SQL с помощью SqlCommandProvider (метод 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 это хороший вопрос. Я действительно подумал об изменении моего сообщения после этого, поскольку я смело утверждал, что это возможно в любом случае. Я подозреваю, что доступ к некоторым специальным sprocs в SQL Server не так просто, или, скорее, я не знаю, как это сделать. :-) Таким образом, вы либо выполняете аналогичный оператор SQL, либо надеетесь, что какой-либо вызов API предоставит необходимые данные. Есть ли особая причина, почему вы предпочитаете этот метод? – s952163

+0

Это именно то, как я делаю этот проект. Я делал только F # в течение месяца или около того, и я использовал SQLDataConnection для получения данных до сих пор. –

1

SQL Server

Exec sp_help 'имя_таблица'

+2

Я не могу использовать это, я могу взаимодействовать только с базой данных через F #. –

+1

@JacksonSentzke: Вы можете, конечно, вызвать хранимые процедуры из F # ... – ildjarn

+0

К сожалению, для этой хранимой процедуры это не так, потому что оно возвращает два результата, общую информацию о таблице, а затем информацию о столбце. – s952163

Смежные вопросы