2014-11-27 16 views
6

Theo cách thông thường của việc sử dụng một nhà cung cấp loại SqlDataConnection được như sau:SqlDataConnection cung cấp loại - thiết cơ sở dữ liệu chuỗi kết nối với thông số script

type dbSchema = SqlDataConnection<"Data Source=MYSERVER\INSTANCE;InitialCatalog=MyDatabase;Integrated Security=SSPI;"> 
let db = dbSchema.GetDataContext() 

Tuy nhiên chúng tôi có một vấn đề đó là chúng tôi muốn sử dụng nhà cung cấp loại hình này trong một Tập lệnh f # trong đó chuỗi kết nối cho cơ sở dữ liệu được truyền dưới dạng tham số.

let connectionString= Array.get args 1 
type dbSchema = SqlDataConnection<connectionString> 

Tuy nhiên nó mang lại cho các lỗi "Đây không phải là một biểu thức hằng hoặc tùy chỉnh có giá trị thuộc tính giá trị"

Có cách nào để làm điều này: Vì vậy, những gì tôi muốn làm một cái gì đó như thế này là gì?

Trả lời

9

Rất tiếc, không có cách nào để thực hiện việc này, nhà cung cấp loại yêu cầu chuỗi thời gian biên dịch. Điều này là để khi bạn biên dịch ứng dụng, nhà cung cấp loại có thể kết nối và truy xuất siêu dữ liệu về cơ sở dữ liệu và tạo ra các kiểu cho trình biên dịch. Bạn có thể chọn để trích xuất ra các chuỗi kết nối thành một chuỗi chữ bằng cách viết nó dưới dạng

[<Literal>] let connString = "Data Source=..." 
type dbSchema = SqlDataConnection<connString> 

Giả sử 2 cơ sở dữ liệu của bạn có cùng một giản đồ, đó là sau đó có thể cung cấp cho chuỗi kết nối thời gian chạy của bạn như một tham số để các GetDataContext phương pháp như

let connectionString = args.[1] 
let dbContext = dbSchema.GetDataContext(connectionString) 
1

cách tôi đã làm nó là tôi có một chuỗi chữ mã hóa cứng (sử dụng "Literal" thuộc tính) cho thời gian sử dụng thiết kế và sử dụng một chuỗi địa phương từ các cấu hình khi nhận được bối cảnh dữ liệu. Tôi sử dụng một lược đồ db cục bộ (cũng được mã hóa cứng) để tăng tốc độ intelli-sense trong quá trình phát triển.

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); 
Các vấn đề liên quan