कनेक्टिविटी की जांच के लिए एसक्यूएल कथन?

मैं एक डमी एसक्यूएल स्टेटमेंट की तलाश में हूं जो कनेक्टिविटी की जांच के लिए सी # एसक्यूएल कनेक्शन से काम करेगा।

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

जिस परिदृश्य के लिए मैं परीक्षण कर रहा हूं वह डेटाबेस से कनेक्टिविटी का नुकसान है, जहां SQLConnections राज्य प्रॉपर्टी अभी भी "ओपन" प्रतीत होती है लेकिन कोई कनेक्टिविटी नहीं है।

0

9 उत्तर

उदाहरण डेल्फी कोड, जिसे मैं भरोसा करता हूं अनुकूलित करना आसान होगा:

function IsConnValid(var Conn: TADOConnection; DBType: TDBType): boolean;
var
  qry : TADOQuery;
begin
  //gimme a connection, and i'll create a query, try to retrieve dummy data.
  //if retrieval works, return TRUE. otherwise, return FALSE.
  qry := TADOQuery.Create(nil);
  try
    qry.Connection := Conn;

    case DBType of
      //syntax for a dummy query varies by vendor.
      dbOracle    : qry.Sql.Add('SELECT 1 FROM DUAL');
      dbSqlServer : qry.Sql.Add('SELECT 1');
    end;  //case

    try
      qry.Open;
      //try to open the query.
      //if we lost the connection, we'll probably get an exception.
      Result := not(qry.Eof);  //a working connection will NOT have EOF.
      qry.Close;
    except on e : exception do
      //if exception when we try to open the qry, then connection went bye-bye.
      Result := False;
    end;  //try-except
  finally
    qry.Free;
  end;  //try-finally
end;
0
जोड़ा

getdate() का चयन करें

0
जोड़ा

इस उद्देश्य के लिए अधिकांश SQL डेटाबेस में 'टेबल' है।

डीबी 2 में, यह है:

select * from sysibm.sysdummy1

जबकि ओरेकल ने स्मृति से,

select * from dual

यह बैक एंड पर डेटाबेस पर निर्भर करेगा।

0
जोड़ा

आप यह कर सकते हैं:

Select 1

ठीक है, खाली स्ट्रिंग या रिक्त स्थान भेजने के बारे में कैसे। वे SQL सर्वर के लिए मान्य आदेश हैं।

0
जोड़ा
SQL सर्वर के लिए ठीक है, लेकिन यह डीबी 2 या ओरेकल के लिए काम नहीं करेगा। पैक्स डायब्लो का जवाब देखें।
जोड़ा लेखक Dave, स्रोत

यदि आप एक नया कनेक्शन खोलने में असमर्थ हैं तो आपको एक त्रुटि मिलनी चाहिए क्योंकि डीबी अनुपलब्ध है।

यह मुझे लगता है जैसे आप हर समय एक कनेक्शन खोल रहे हैं (जो आमतौर पर एक बुरा विचार है - बैच निष्पादित होने से पहले एक नया कनेक्शन खोला जाना चाहिए)। क्या यह मामला है?

0
जोड़ा
हाँ बैच शुरू होने पर एक नया कनेक्शन खोला जाता है लेकिन बैच 15 मिनट से ऊपर ले सकता है।
जोड़ा लेखक Omar Kooheji, स्रोत
ठीक है ... तो फिर क्या? बैच कुछ मिनटों के बाद निरस्त करता है? क्या आपका कनेक्शन टाइमआउट काफी ऊंचा है? (यह 2 मिनट तक डिफ़ॉल्ट है।
जोड़ा लेखक StingyJack, स्रोत

कनेक्टिविटी का नुकसान कभी भी हो सकता है।

क्या होगा यदि प्रस्तावित चयन विवरण ठीक से निष्पादित होते हैं, लेकिन कनेक्शन सफलतापूर्वक निष्पादित करने के बाद तुरंत टूट जाता है?

0
जोड़ा
यदि आप केवल स्वास्थ्य जांच लिख रहे हैं, तो यह अभी भी उपयोगी हो सकता है कि डेटाबेस कनेक्शन जीवित है (या अधिक महत्वपूर्ण रूप से, जिंदा नहीं) समय पर किसी विशेष पल पर।
जोड़ा लेखक Eric Smith, स्रोत

सबसे आसान तरीका एक चयन निष्पादित करना है जो कुछ भी नहीं करता है।

SELECT N'Test'
0
जोड़ा

कनेक्टिविटी के परीक्षण के लिए एक डमी स्टेटमेंट का उपयोग करने के बजाय, आपके द्वारा निष्पादित प्रत्येक SQL स्टेटमेंट के लिए आपके कार्यान्वयन के कनेक्ट-अप अपवाद को पकड़ना बेहतर होगा। मैंने सिस्टम को देखा है जहां डेटाबेस के सीपीयू समय के 10% से ऊपर इन डमी प्रश्नों का जवाब दिया जाता है।

0
जोड़ा

यह पता लगाने का एक तरीका है कि डेटाबेस से कनेक्शन वास्तव में वास्तव में मौजूद है, कनेक्शन पर कुछ ऑपरेशन करने का प्रयास करना है। यदि कनेक्शन की मृत्यु हो गई है, तो कनेक्शनस्टेट प्रॉपर्टी अभी भी "ओपन" के रूप में बनी हुई है, लेकिन जब आप इसके साथ कुछ करने की कोशिश करते हैं और आपको अपना अपवाद मिल जाएगा। उदाहरण के लिए:

SqlConnection sqlConn;
    private bool dbConnectionExists() {
        try
        {
            sqlConn.ChangeDatabase("MyDBname");
            return true;
        }
        catch
        {
            return false;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (dbConnectionExists())
        {
           //Connection ok so do something            
        }
    }

इस प्रकार के ऑपरेशन के बाद कनेक्शनस्टेट संपत्ति "बंद" में बदल जाती है और विफल हो जाती है, इसलिए यदि आप चाहें तो राज्य को जांच सकते हैं।

उम्मीद है की वो मदद करदे।

0
जोड़ा