F #: Невозможно вызвать хранимую процедуру в базе данных MariaDB, используя SQLProvider - PullRequest
0 голосов
/ 06 сентября 2018

Я адаптировал свой код из инструкции здесь .

open FSharp.Data.Sql

let [<Literal>] connection_str = "Server=localhost;Port=3306;SSL Mode=None;Uid=<UID>;Pwd=<PWD>;Database=<DB>"
type provider = SqlDataProvider<Common.DatabaseProviderTypes.MYSQL, connection_str>
let context = provider.GetDataContext()

context.Procedures.SpGetFrontContracts.Invoke(1)

Intellisense работает до периода после SpGetFrontContracts. После этого ничего. Пытаясь скомпилировать, я получаю:

Error   FS0039  The field, constructor or member 'Invoke' is not defined.

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

SpGetFrontContracts - это допустимая хранимая процедура в моей базе данных (ее фактическое имя - sp_get_front_contracts, но поставщик типа, похоже, удаляет подчеркивания). Я могу успешно запустить его, используя HeidiSQL. В случае, если это полезно, вот код создания:

CREATE DEFINER=`<UID>`@`localhost` PROCEDURE `sp_get_front_contracts`(
    IN `Group` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    SELECT p.DateTime, p.Contract, p.Volume, c.Name
    FROM tbl_contract_price_data p
    INNER JOIN tbl_contracts c on p.Contract = c.ID
    WHERE c.`Group` = `Group`
    ORDER BY p.DateTime
    LIMIT 1000;
END

Я попытался создать более простой sproc с именем 'test', без параметров и просто запустил оператор select. Он обнаружился в поставщике типов в разделе «Процедуры», но я снова не смог вызвать Invoke.

Мое лучшее предположение заключается в том, что Invoke наследуется из некоторого пространства имен или ссылки на сборку, которой у меня нет, поэтому в настоящее время я просматриваю источник SqlProvider , чтобы попытаться выяснить, что это может быть. Я сейчас ссылаюсь:

  • FSharp.Core
  • FSharp.Data
  • FSharp.Data.SqlProvider
  • mscorlib
  • System
  • System.Core
  • System.Data
  • System.Numerics
  • System.ValueTyple
  • System.Xml.Linq

Спасибо за любые предложения.

Редактировать: Похоже, что действие находится в SqlDesignTime.fs в функции generateSprocMethod, которая начинается в строке 346. Я попытаюсь выяснить, что там происходит.

Редактировать: После трех дней ударившись головой об этом, я сдался и просто использовал MySQL Connector / NET .

1 Ответ

0 голосов
/ 02 октября 2018

Я не уверен насчет ваших базовых данных или структур, но я знаю, что есть два других (правильных) способа их решения:

WHERE c.`Group` =   `Group`  -- what you have.

-- possible corrections:
WHERE c.`Group` = p.`Group`  -- did you mean this?
WHERE c.`Group` =   "Group"  -- or this?
...