无法在Linux中的Mono上使用F#中的SqlDataConnection进行编译

时间:2016-07-28 20:42:29

标签: sql-server f# mono monodevelop

我在Linux上使用mono,使用 F#代码访问SQL Server数据库。我正在使用 SqlDataConnection

我的代码如下:

namespace AggregatorService

open FSharp.Data.TypeProviders
open System.Data
open System.Data.Linq

module DataBaseProvider = 

    type databaseConn = SqlDataConnection<ConnectionString = "Data Source=10.0.40.11;Initial Catalog=master;Persist Security Info=True;User ID=sa;Password=xxxxx">

    let getDataContext() =
        let dbConn = databaseConn.GetDataContext();
        dbConn

我无法编译此代码。我收到了这个恼人的错误:

  

类型提供程序'FSharp.Data.TypeProvider.DesignTime.DataProviders'报告了错误读取架构。无法访问给定密钥(FIS3033)

我的package.config文件是:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Deedle" version="1.2.5" targetFramework="net40" />
  <package id="FSharp.Core" version="4.0.0.1" targetFramework="net40" />
  <package id="FSharp.Data" version="2.3.2" targetFramework="net40" />
  <package id="FSharp.Data.SqlClient" version="1.8.2" targetFramework="net40" />
  <package id="FSharp.Data.TypeProviders" version="5.0.0.2" targetFramework="net40" />
  <package id="NUnit" version="2.6.4" targetFramework="net40" />
  <package id="SQLProvider" version="1.0.22" targetFramework="net40" />
</packages>

C#程序是从同一台计算机连接的,因此,我认为问题不在于单声道配置或在Linux机器上。

任何人都有解决方案或提示如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

不幸的是,它看起来单声道无法处理此包也是我希望的。搜索我发现两年前有一个错误,但我还没有找到任何解决方案。

我正在做的事情是使用 FSharp.Data.Sql而不是,然后,我使用 SqlDataProvider 而不是 SqlDataConnection ,ow它看起来:

namespace AggregatorService

打开FSharp.Data.Sql 打开Deedle 打开System.Linq

模块DatabaseService =

[<Literal>]
let connectionString = "Data Source=10.0.40.11;Initial Catalog=nextel_ericsson_umts_brasil;Persist Security Info=True;User ID=sa;Password=****";

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

type Database() =

    static member contextDbo() =
        bd.GetDataContext().Dbo

    static member acAgregations() =
        Database.contextDbo().AcAgregations |> Frame.ofRecords

    static member acBusyHourDefinition() =
        Database.contextDbo().AcBusyHourDefinition
        |> Frame.ofRecords
        //|> Frame.getCols["time_agregation_type", "destination_table", "reference_table", "alternative_reference_table_scan", "formula"]

    static member acBusyHourDefinitionFilterByTimeAgregationTipe(value:int) = 
        Database.acBusyHourDefinition()
        |> Frame.indexRowsInt "tome_agregation_type"
        |> Frame.getRows
        |> Frame.filterRowValues( fun row -> row.GetAs<string list>)

我可以看到,它的工作方式相同。我不知道预计会有什么不同,但它直到现在才处理我的需求。