2014-11-27 3 views
6

इस प्रकार एक SqlDataConnection प्रकार प्रदाता का उपयोग करने का सामान्य तरीका है के रूप में: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> 

हालांकि यह त्रुटि देता है

वहाँ यह करने के लिए कोई तरीका है "यह एक निरंतर अभिव्यक्ति या वैध कस्टम विशेषता मान नहीं है": तो मुझे क्या करना चाहते हैं कुछ इस तरह है?

उत्तर

9

दुर्भाग्यवश ऐसा करने का कोई तरीका नहीं है, प्रकार प्रदाता को एक संकलन समय शाब्दिक स्ट्रिंग की आवश्यकता होती है। ऐसा इसलिए है कि जब आप एप्लिकेशन को संकलित कर रहे हों, तो प्रकार प्रदाता डेटाबेस के बारे में मेटाडेटा को कनेक्ट और पुनर्प्राप्त करने में सक्षम होता है और कंपाइलर के प्रकार उत्पन्न करता है। आप प्रपत्र

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

में इसे लिखने मान लिया जाये कि अपने 2 डेटाबेस एक ही स्कीमा है द्वारा एक स्ट्रिंग शाब्दिक में कनेक्शन स्ट्रिंग बाहर निकालने के लिए चुन सकते हैं, यह तो संभव है GetDataContext के लिए एक पैरामीटर के रूप में अपने क्रम कनेक्शन स्ट्रिंग की आपूर्ति करने

let connectionString = args.[1] 
let dbContext = dbSchema.GetDataContext(connectionString) 
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); 
संबंधित मुद्दे