F # SqlProvider - как получить доступ к результатам хранимой процедуры? - PullRequest
0 голосов
/ 14 мая 2018

Я использую SQLProvider из NuGet (https://www.nuget.org/packages/SQLProvider/ v1.1.42) в проекте F # для доступа к нашей базе данных MSSQL.

Я имею в виду пример кода отсюда, https://fsprojects.github.io/SQLProvider/core/programmability.html, а также тесты исходного кода на GitHub, https://github.com/fsprojects/SQLProvider/blob/master/tests/SqlProvider.Tests/scripts/MySqlTests.fsx.

#r @"....\packages\SQLProvider.1.1.42\lib\net451\FSharp.Data.SqlProvider.dll"
#r @"....\System.Data.Linq.dll"

open System
open FSharp.Data.Sql
open FSharp.Data.Sql.Common
open System.Data.Linq

type SeriesResult = { .. fields .. }

[<Literal>]
let ConnectionString = @"connStr"

type Sql = SqlDataProvider<
                    ConnectionString = ConnectionString,
                    DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER>

let db = Sql.GetDataContext()

let test = 
    [
        for f in db.Procedures.MyStoredProcedure.Invoke("param").ResultSet do
            yield f.MapTo<SeriesResult>()
    ]

Мне нужен доступ к результатам вызова MyStoredProcedure, но ResultSet с ошибками error FS0039: The field, constructor or member 'ResultSet' is not defined". Я также получаю это для ColumnValues ​​и для MapTo (предположительно, потому что тип неизвестен).

Есть ли дополнительная библиотека, на которую я должен ссылаться?

У меня есть: FSharp.Core, FSharp.Data, FSharp.Data.SqlProvider, mscorelib, System, System.Core, System.Data, System.Data.Linq, System.Xml.Linq

Спасибо!

(хотел пометить с помощью SQLProvider - но не могу!)

1 Ответ

0 голосов
/ 13 августа 2018

Одной из возможных причин этого является то, что поток интеллигентного чувства, вероятно, превысил время ожидания ответа от поставщика SQL.

Сохраненные процедуры и набор типов для переноса результата ResultSet вычисляются лениво (при вводе .).Это хорошо с одной стороны, так как это означает, что провайдер не анализирует всю базу данных при создании экземпляра, тянет за собой массу вещей, которые вы, вероятно, не собираетесь использовать.Однако у него есть побочный эффект: от выполнения нетривиального объема работы при завершении . по первому запросу мы кешируем результат после этого.Я полагаю, что у Microsoft есть метрика, которая говорит, что любая интеллектуальная работа должна быть завершена за 250 мс, но каково фактическое время ожидания потока, я не уверен.С такими языками, как C # и F #, достижение цели ответа в 250 мс может быть большой проблемой для больших решений, но бросить базу данных в смесь (даже небольшую локальную базу данных) это становится очень трудной целью для достижения.

Почему он не восстановился и повторите попытку, пока не добавите ссылки, будет известно только Visual Studio;Однако обычно достаточно просто закрыть и снова открыть файл.В редких случаях выгрузите проект из решения и перезагрузите.

...