2009-07-02 13 views
6

वर्तमान में, मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जो LINQ-to-SQL के माध्यम से विभिन्न डेटाबेस (और इस प्रकार कनेक्ट) पर निर्भर करता है। डेटाबेस में से एक के लिए, कनेक्शन स्ट्रिंग भिन्न हो सकती है और इस प्रकार कॉन्फ़िगर करने योग्य है - हालांकि, इस डेटाबेस की स्कीमा सभी कनेक्शन स्ट्रिंग के लिए समान है।डेटाकॉन्टेक्स्ट टेबल या दृश्य मौजूद है या नहीं,

कॉन्फ़िगर करने योग्य कनेक्शन स्ट्रिंग के कारण, मैं अपने एप्लिकेशन के स्टार्टअप के दौरान डेटाकॉन्टेक्स्ट को सत्यापित करना चाहता हूं, यह सुनिश्चित करने के लिए कि मेरे द्वारा उपयोग किए जाने वाले सभी टेबल और दृश्य उपलब्ध हैं।

Table<T>DataContext ऑब्जेक्ट में ऑब्जेक्ट्स हमेशा प्रारंभ किए जाते हैं - भले ही संबंधित SQL तालिका या दृश्य में कोई रिकॉर्ड न हो।

तो फिर।

 bool valid = _dataContext.Articles.Count() > 0 
      && _dataContext.Customers.Count() > 0 
      && _dataContext.Orders.Count() > 0; 

हालांकि यह काम करता है, वैध के मूल्य का निर्धारण काफी कुछ समय (प्रत्येक टेबल के हर रिकॉर्ड को छुआ है) है, जो अंततः एक समय बाहर में जो परिणाम लेता है: वर्तमान में, सत्यापन जाँच के रूप में निम्नानुसार किया जाता है । तो, क्या यह निर्धारित करने के लिए एक तेज, अधिक विश्वसनीय तरीका है कि DataContext के Table<T> वास्तव में संबंधित डेटाबेस में एक तालिका के रूप में मौजूद है या नहीं?

ले लो अपनी मेज का नाम:

+2

ए (मैं उसे एक वोट दें :) दिया) छोटे सुधार: गिनती()> 0. के बजाय किसी भी() एक्सटेंशन विधि का उपयोग करें। वास्तविक प्रश्न का उत्तर नहीं है। –

+0

@ जोर्न - आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए, क्योंकि मुझे लगता है कि यह सबसे अच्छा विकल्प है ... –

उत्तर

5

यहाँ एक (untested) विचार है। आप मुश्किल में कोड कर सकते हैं, या आप के माध्यम से

TableAttribute attribute = (TableAttribute)typeof(MyTableObject) 
          .GetCustomAttributes(typeof(TableAttribute), true) 
          .Single(); 
string name = attribute.Name; 

MyTableObject प्रोग्राम के रूप में यह कर सकते हैं हड़पने LINQ करने वाली एसक्यूएल उत्पन्न अपने Table, अर्थात में निहित वस्तु, सामान्य पैरामीटर Table<T> में T है।

(TableAttributeSystem.Data.Linq.Mapping में है।)

var db = new MyDataContext(); 
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'"); 
bool hasTable = results.Any(s => "dbo." + s == name);  
+0

ग्रेट, यह है। मैंने WHERE-clause को हटा दिया और परिणामों को सूची में संग्रहीत किया - 'var results' केवल एक बार समझा जा सकता है। अभी भी, तेजस्वी तेजी से। महान। – dbaw

4

जेसन के जवाब पर एक मामूली बदलाव के रूप में DataContext.ExecuteQuery विधि का उपयोग करें

public bool TableExistsInDatabase<T>() 
{ 
    TableAttribute attribute = (TableAttribute)typeof(T) 
          .GetCustomAttributes(typeof(TableAttribute), true) 
          .Single(); 

    var result = ExecuteQuery<bool>(
       String.Format(
        "IF OBJECT_ID('{0}', 'U') IS NOT NULL 
        SELECT CAST(1 AS BIT) ELSE 
        SELECT CAST(0 AS BIT)", attribute.Name)); 

    return result.First(); 
} 
संबंधित मुद्दे