2014-11-27 12 views
6

izleyen bir SqlDataConnection tipi sağlayıcısını kullanarak normal yolu olarak:SqlDataConnection tipi sağlayıcı - Senaryo parametresi ile ayar veritabanı bağlantı dizesi

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

Elimizdeki biz bu tür sağlayıcısı kullanmak istiyorum bir sorun Veritabanı için bağlantı dizesinin parametre olarak iletildiği f # betiği.

o hata veriyor Bununla
let connectionString= Array.get args 1 
type dbSchema = SqlDataConnection<connectionString> 

Bunu yapmanın bir yolu var mı "Bu sabit bir ifade ya da geçerli bir özel öznitelik değeri değil": böyle bir şey Yani ne yapmak istiyorsunuz nedir?

cevap

9

Ne yazık ki bunu yapmanın bir yolu yok, tip sağlayıcı bir derleme zamanı değişmez dizesi gerektirir. Bu, uygulamayı derlediğinizde, tür sağlayıcının veritabanı hakkındaki meta verileri bağlayabilmesi ve alabilmesi ve derleyicinin türlerini oluşturabilmesidir. Bunu 2 veritabanları aynı şemayı sahip varsayarsak formu

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

bunu yazarak, bir dizgi içine bağlantı dizesini dışarı ayıklamak için seçebilir, bu GetDataContext parametre olarak sizin çalışma zamanı bağlantı dizesini tedarik etmek, sonra mümkündür

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

bunu yapıyorum yolu gibi yöntem i tasarım defalık kullanım için ("Literal" özelliğini kullanarak) kodlanmış değişmez dize ve veri içeriği alırken yapılandırmasından yerel dize kullanmaktır. Geliştirme sırasında zekayı hızlandırmak için yerel bir db şeması (ayrıca kodlanmış) kullanıyorum.

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);