我在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机器上。
任何人都有解决方案或提示如何解决这个问题?
答案 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>)
我可以看到,它的工作方式相同。我不知道预计会有什么不同,但它直到现在才处理我的需求。