F # Получить данные таблицы базы данных

#sql #f#

#sql #f#

Вопрос:

Я пытаюсь получить данные с SQL-сервера Azure. Я смог получить данные с помощью этого метода:

 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)
  

Но я получаю эту ошибку: «Поиск по объекту неопределенного типа на основе информации, предшествующей этой программной точке. Перед этой программной точкой может потребоваться аннотация типа, чтобы ограничить тип объекта. Это может позволить разрешить поиск «.

Комментарии:

1. второй пример должен помочь: fsprojects.github.io/FSharp.Data.SqlClient

2. Поставщик вероятности?

3. нет, SqlCommandProvider

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

5. Возможно, это может быть другой вопрос о том, как параметризовать (если возможно) имя таблицы в запросе.

Ответ №1:

Я придумал это.

 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
  

Это возвращает все значения в таблице

Ответ №2:

Это один из способов (с использованием поставщика типа SqlClient) выбрать все данные из таблицы. Если ваша таблица слишком большая, она вернет много. Поэтому я просто выбираю верхние 1000 строк. Замените tablenn выбранным вами именем таблицы. Вы можете параметризовать столбцы, но если вам нужно указать само имя таблицы в качестве параметра, вам может потребоваться использовать хранимую процедуру, которая принимает таблицу в качестве параметра (или использовать кавычки в других поставщиках типов).

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

 #r @"..packagesFSharp.Data.SqlClient.1.8.2libnet40FSharp.Data.SqlClient.dll"

open FSharp.Data
open System

[<Literal>]
let connectionString = @"Data Source=(localdb)MSSQLLocalDB;AttachDbFilename=C:UsersuserNameDocumentsTest.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. Это также упрощает выбор всех данных из таблицы.

Комментарии:

1. Это сработало бы, но из-за структуры моей программы это не позволит мне использовать литералы, и когда я удаляю литерал, я снова получаю эту ошибку: «Поиск по объекту неопределенного типа на основе информации, предшествующей этой программной точке. Перед этой программной точкой может потребоваться аннотация типа, чтобы ограничить тип объекта. Это может позволить разрешить поиск «.

2. к сожалению, я не знаком со структурой вашей программы, но, если я вас правильно понял, вы хотите, чтобы имя таблицы было параметром?