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

、私は "TABLE1" と呼ばれるテーブルを持っていることがわかります。私が書く例を続ける:

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

[documentation](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から継承されたストック型プロバイダの1つですが、これはSqlServerでもうまくいきます。しかし、開発中のこれら2つのタイプのプロバイダ、すなわちあらゆる種類のデータベースで動作する[SQLProvider](http://fsprojects.github.io/SQLProvider/)と、[SQLClient](http:// fsprojects .github.io/FSharp.Data.SqlClient /)。これはSqlServer固有のものです。 – s952163

関連する問題