2017-03-17 107 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

相關問題