2017-03-17 104 views
0

我读Walkthrough: Accessing a SQL Database by Using Type ProvidersF#类型提供的SQL Server实例

,并通过使用我的测试数据库的工作吧。到目前为止,我已经在F#交互中完成了这项工作:

#r "System.Data.dll" 
#r "FSharp.Data.TypeProviders.dll" 
#r "System.Data.Linq.dll" 
open System 
open System.Data 
open System.Data.Linq 
open Microsoft.FSharp.Data.TypeProviders 
open Microsoft.FSharp.Linq 
type dbSchema = SqlDataConnection<"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Test;Integrated Security=SSPI;"> 

现在,我知道这个数据库有一个名为test的表。例如在SSMS:

SSMS select * from sys.tables

所以,你可以看到,我有一个名为 “表1” 表。继续该示例我写:

let db = dbSchema.GetDataContext() 
let table1 = db.table1 

但后来我得到的错误:

error FS0039: The field, constructor or member 'table1' is not defined

那么,我究竟错在这里做什么?

FYI:F#编译器版本11.0.60610.1

+1

当你输入'db.'时,你看到了什么? - 完成是否提供任何表名?文件中是否有其他错误? –

+0

@Tomas当我键入分贝。没有提供完成。 (运行在F#交互式,我猜它不支持自动完成)到目前为止没有其他错误 – user1443098

+0

@Ed db.sys.tables不起作用:“错误FS0039:字段,构造函数或成员'sys'未定义“但是然后sys.tables是一个视图,而不是一个表。也许还有另一种访问视图的方式? – user1443098

回答

2

的FSharp SqlDataConnection型供应商错误地映射在数据库中,其中第一个字母大写名称表,而不管实际的表名。在我的情况下,该表被称为“table1”,但类型提供者将其映射到“Table1”。文档中未涵盖此特性。

这是令人困惑,意外和无证的行为。

+1

作为[文档](https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/sqldataconnection-type-provider-%5Bfsharp%5D)提到,提供程序使用SqlMetal.exe来生成类型。不幸的是,虽然SqlMetal提供了一个控制复数的选项(它也被类型提供者公开),但是没有这种控制大写的选项。 – kvb

+0

对,我会给你打个电话。特别是当你必须记住大写表名的时候。试想一下,你在SQL Server上开始使用大写字母的名字,在你的代码中使用它,然后将它改为在SQL Server上未使用大写字母。您的代码将在下次尝试访问它时死亡。我建议类型提供程序对来自SQL Server的对象不区分大小写。但是,谁来发送? – user1443098

+1

你当然可以向MS提出投诉。 :-)但是请注意文档的顶部:'本指南是为F#3.0编写的,将会更新。有关最新的跨平台类型提供程序,请参阅FSharp.Data。这是来自F#3.0的股票类型提供者之一,它适用于SqlServer,确实如此。但是,您可以探索正在不断开发的这两种类型的提供程序:[SQLProvider](http://fsprojects.github.io/SQLProvider/),它适用于各种数据库,[SQLClient](http:// fsprojects .github.io/FSharp.Data.SqlClient /),这是SqlServer特定的。 – s952163

相关问题