2

我正在编写一个用于 Azure Worker 角色的 F#。我希望该类将连接字符串 a 作为参数。我创建了一个数据库连接

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

但是 dbSchema 是一种类型,因此它不能嵌入到我的类中(另一种类型)。我可以创建两个单独的模块,一个带有数据库连接,另一个带有我的班级

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 数据库的类型提供程序将连接字符串用于两个不同的目的。首先,它需要一个(在编译时)来生成数据库模式。其次,您可以(可选地)在实际运行程序时再给它一个在运行时使用。

编译时连接字符串需要指定为参数,SqlDataConnection<...>运行时连接字符串可以传递给GetDataContext(...)操作。

因此,您可以使用静态已知的编译时连接字符串定义您的类型:

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

当你想创建一个数据库连接的实例时,你可以传递另一个连接字符串:

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模块中的值)相比,这会为每个创建一个新db实例有所不同Factory,但我想如果Factory将连接字符串作为参数,这是可以预期的。

于 2012-10-28T13:16:37.353 回答