F#:无法使用SQLProvider

时间:2018-09-06 06:35:48

标签: sql f# mariadb type-providers

我根据指令here修改了代码。

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

我尝试创建一个更简单的名为“ test”的存储过程,不带任何参数,只运行一条select语句。它显示在“过程”下的类型提供程序中,但是我再也无法调用Invoke

我最好的猜测是Invoke是从我没有的某些命名空间或程序集引用中继承的,所以我目前正在研究SqlProvider source来尝试找出它可能是什么。我当前正在引用:

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

谢谢您的任何建议。

编辑:动作似乎发生在SqlDesignTime.fs中的一个名为generateSprocMethod的函数中,该函数从346行开始。我将尝试弄清楚那里发生了什么。

编辑:三天后,我放弃了这个想法,我放弃了,只用了MySQL Connector/NET

1 个答案:

答案 0 :(得分:0)

我不确定您的基础数据或结构,但是我知道这是另外两种(正确的)解决方法:

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

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