我正在编写一个与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来创建连接?
答案 0 :(得分: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
将连接字符串作为参数。