使用SqlDataConnection类型提供程序的常规方法如下:
type dbSchema = SqlDataConnection<"Data Source=MYSERVER\INSTANCE;InitialCatalog=MyDatabase;Integrated Security=SSPI;">
let db = dbSchema.GetDataContext()
但是我们遇到一个问题,我们想在f#脚本中使用这种类型的提供程序,其中数据库的连接字符串作为参数传递。所以我想做的是这样的事情:
let connectionString= Array.get args 1
type dbSchema = SqlDataConnection<connectionString>
但是它会给出错误“这不是常量表达式或有效的自定义属性值”
有没有办法做到这一点?
答案 0 :(得分:9)
不幸的是,没有办法做到这一点,类型提供者需要一个编译时文字字符串。这样,当您编译应用程序时,类型提供程序能够连接和检索有关数据库的元数据并生成编译器的类型。您可以选择通过以
形式写入连接字符串将其提取到字符串文字中[<Literal>] let connString = "Data Source=..."
type dbSchema = SqlDataConnection<connString>
假设您的2个数据库具有相同的模式,那么可以将运行时连接字符串作为参数提供给GetDataContext方法,如
let connectionString = args.[1]
let dbContext = dbSchema.GetDataContext(connectionString)
答案 1 :(得分:1)
我一直在做的方式是我有一个硬编码的文字字符串(使用“Literal”属性)用于设计时使用,并在获取数据上下文时使用配置中的本地字符串。我使用本地数据库模式(也是硬编码)来加速开发过程中的智能。
type private settings = AppSettings<"app.config">
let connString = settings.ConnectionStrings.MyConnectionString
type dbSchema = Microsoft.FSharp.Data.TypeProviders.SqlDataConnection<initialConnectionString, Pluralize = true, LocalSchemaFile = localDbSchema , ForceUpdate = false, Timeout=timeout>
let indexDb = dbSchema.GetDataContext(connString);