2

Azure Worker ロールで使用する F# を作成しています。クラスに接続文字列 a をパラメータとして持たせたい。でdb接続を作成します

type dbSchema = SqlDataConnection<"...">
let db = dbSchema.GetDataContext()

ただし、dbSchema は型であるため、クラス (別の型) に埋め込むことはできません。2 つの個別のモジュールを作成できます。1 つは db 接続を使用し、もう 1 つは自分のクラスを使用します。

module DataSource =

    [<Literal>]
    let connectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=Service;Integrated Security=True"

    type dbSchema = SqlDataConnection<connectionString>
    let db = dbSchema.GetDataContext()

module DealerFactory =

    type Factory(connectionString) =

        member this.GetList(latitudeLeftTop, longitudeLeftTop, latitudeRightBottom, longitudeRightBottom) =
        ".."

しかし、クラスのコンストラクターで connectionString を使用して接続を作成するにはどうすればよいでしょうか?

4

1 に答える 1

7

SQL データベースの型プロバイダーは、2 つの異なる目的で接続文字列を使用します。まず、データベース スキーマを生成するために (コンパイル時に) 1 つ必要です。第二に、(オプションで) プログラムを実際に実行するときに実行時に使用する別のものを与えることができます。

コンパイル時の接続文字列をパラメーターとして指定する必要がSqlDataConnection<...>あり、実行時の接続文字列を操作に渡すことができますGetDataContext(...)

したがって、静的に既知のコンパイル時の接続文字列を使用して型を定義できます。

[<Literal>]
let connectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=Service; ..."
type dbSchema = SqlDataConnection<connectionString>

DB 接続のインスタンスを作成する場合は、別の接続文字列を渡すことができます。

type Factory(connectionString) =
  // Create connection to the DB using (a different)
  // connection string specified at runtime
  let db = dbSchema.GetDataContext(connectionString)

  member this.GetList( latitudeLeftTop, longitudeLeftTop, 
                       latitudeRightBottom, longitudeRightBottom) =
    // Use local 'db' to access the database
    query { for v db.Table do select v }

元のコード(モジュールの値を使用)と比較すると、これによりすべての新しいインスタンスdbが作成されるという違いがありますが、接続文字列を引数として取る場合、これは予想されることだと思います。dbFactoryFactory

于 2012-10-28T13:16:37.353 に答える