2013-03-01 4 views
5

मेरे पास एक डेल्फी 6 एप्लिकेशन है जो लक्ष्य डेटाबेस से कनेक्ट करने के लिए ओडीबीसी डीएसएन का उपयोग करता है। मैं उस टेक्स्ट को शामिल करना चाहता हूं जो डेटाबेस के नाम को सूचीबद्ध करता है जो डीएसएन से जुड़ा हुआ है। मैंने एसक्यूएल कमांड db_name() का उपयोग करने की कोशिश की लेकिन जब मैं SQL सर्वर में लॉग इन करता हूं तो यह काम करने के बावजूद प्रतिक्रिया में केवल एक शून्य प्राप्त हुआ।ओडीबीसी डीएसएन कनेक्टेड एप्लिकेशन में डेटाबेस नाम की पहचान करने की आवश्यकता

क्या डेल्फी के भीतर कोई तरीका है यह पहचानने के लिए कि मैं किस डेटाबेस से कनेक्ट हूं? मैं sys.databases तालिका ऊपर खींचने सकते हैं, लेकिन पहचान करने के लिए कैसे जो डेटाबेस एक मैं

से जुड़ा रहा हूँ एक उदाहरण के रूप में है कुछ नहीं कर रहा हूँ:

अगर मैं dsn LocalDSN मैं से कनेक्ट कर रहा हूँ उपयोगकर्ता को प्रदर्शित करने में सक्षम होना चाहते हैं कि वे डेटाबेस से जुड़े हुए हैं, जहां डेटाबेस एसक्यूएल डेटाबेस का नाम है जिसके साथ वे संचार कर रहे हैं।

+4

आप नहीं DSN नाम एसक्यूएल के माध्यम से, सुनिश्चित करें कि संपत्ति जहां यह कनेक्शन वस्तु तुम में रहता है से ले जा सकते हैं के लिए ले जा सकते हैं के बाद से AFAIK इंजन ही तंत्र कनेक्ट करने के लिए प्रयोग कर रहे हैं के बारे में पता नहीं है, लेकिन आप का उपयोग करते हुए। उदाहरण के लिए, यदि आप TSQLConnection का उपयोग करते हैं, तो यह पैरामीटर पर संग्रहीत होता है। – jachguate

+0

दुर्भाग्य से कनेक्शन ऑब्जेक्ट में केवल तीन गुण हैं - डीएसएन का नाम और उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड। आवेदन एक TQuery और TDatabase वस्तु (vcl से दोनों) का उपयोग है कि अगर – ChargerIIC

+0

में मदद करता है @jachguate आप बनाना चाहिए एक जवाब है कि है। –

उत्तर

3

ओडीबीसी डीएसएन विंडोज रजिस्ट्री में संग्रहीत है। ध्यान रखें कि विंडोज रजिस्ट्री, और इसलिए ओडीबीसी डीएसएन सेटिंग्स 32 और 64 बिट संस्करणों के बीच अलग हो गई हैं। आप HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME] के माध्यम से इस जानकारी तक पहुंच सकते हैं और फिर डेटाबेस या सर्वर नाम जानने के लिए Database या Server मान पढ़ें।

आप सर्वर और इन कार्यों के साथ डेटाबेस नाम पढ़ सकते हैं:

uses 
    Registry; 

function ServerOfDSN(const Name: String): String; 
var 
    R: TRegistry; 
    K: String; 
begin 
    K:= 'Software\ODBC\ODBC.INI\'+Name; 
    R:= TRegistry.Create(KEY_READ); 
    try 
    R.RootKey:= HKEY_LOCAL_MACHINE; 
    if R.KeyExists(K) then begin 
     if R.OpenKey(K, False) then begin 
     if R.ValueExists('Server') then 
      Result:= R.ReadString('Server'); 
     R.CloseKey; 
     end; 
    end; 
    finally 
    R.Free; 
    end; 
end; 

function DatabaseOfDSN(const Name: String): String; 
var 
  R: TRegistry; 
  K: String; 
begin 
    K:= 'Software\ODBC\ODBC.INI\'+Name; 
    R:= TRegistry.Create(KEY_READ); 
    try 
    R.RootKey:= HKEY_LOCAL_MACHINE; 
    if R.KeyExists(K) then begin 
     if R.OpenKey(K, False) then begin 
     if R.ValueExists('Database') then 
      Result:= R.ReadString('Database'); 
     R.CloseKey; 
     end; 
    end; 
    finally 
    R.Free; 
    end; 
end; 

क्या डेटाबेस इंजन और ड्राइवरों आप उपयोग कर रहे आधार पर, इस रजिस्ट्री कुंजी की सामग्री को अलग हो सकता है, और इसलिए वहाँ एक संभावना है कि Server या Database आपके लिए आवश्यक रजिस्ट्री मान नहीं हो सकता है, लेकिन इसे स्वयं को जांचें और इसे पढ़ने के तरीके के बारे में जानने के लिए रजिस्ट्री में अपना मान नाम ढूंढें।

+0

नोट: प्रश्न के आरंभिक गलत व्याख्या के कारण मैंने केवल सर्वर नाम शामिल किया था। मैंने मूल रूप से सर्वर नाम के साथ उत्तर दिया, और बाद में डेटाबेस नाम जोड़ा जब मुझे एहसास हुआ कि क्या पूछा जा रहा था। –

+0

मेरे ओएस के 64 बिट खंड के तहत सेटिंग्स मिली। मैं वहां से एप्लिकेशन खींचने और डेटाबेस नाम के लिए 32 बिट स्थान प्राप्त करने में सक्षम हो जाऊंगा। धन्यवाद! – ChargerIIC

1

आप डीएसएन की सामग्री प्राप्त करने के लिए SQLGetPrivateProfileString ओडीबीसी एपीआई का उपयोग कर सकते हैं।

int SQLGetPrivateProfileString( 
LPCSTR lpszSection, 
LPCSTR lpszEntry, 
LPCSTR lpszDefault, 
LPCSTR RetBuffer, 
INT  cbRetBuffer, 
LPCSTR lpszFilename); 

यहाँ,

lpszSection = रजिस्ट्री अनुभाग में आप के लिए विवरण चाहते हैं। यह आपके मामले में डीएसएन नाम होगा।

lpszEntry = कुंजी जो आप से मूल्य निकालना चाहते हैं। आप डेटाबेस नाम की जानकारी प्राप्त करना चाहते हैं ताकि डेटाबेस रजिस्ट्री जानकारी संग्रहीत करने के लिए कुंजी नाम क्या है, यह जानने के लिए आपको रजिस्ट्री प्रविष्टि HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI [YOUR_DSN_NAME] की जांच करनी होगी। ऐसा इसलिए है क्योंकि अलग-अलग ड्राइवर के पास डेटाबेस नाम संग्रहीत करने के लिए अलग-अलग कुंजी नाम हो सकते हैं।

lpszDefault = अंतिम तर्क (lpszEntry) में निर्दिष्ट कुंजी के लिए डिफ़ॉल्ट मान यदि कुंजी नहीं मिली है।

RetBuffer = सूचक आउटपुट बफर जिसमें निर्दिष्ट कुंजी के लिए मूल्य प्राप्त होता है करने के लिए।

cbRetBuffer = बफर का आकार वर्णों में रेटबफर द्वारा इंगित किया गया।

lpszFilename = फ़ाइल का नाम जहां आप इन प्रविष्टियों को खोजते हैं। यह आपके मामले में odbc.ini होगा।

नमूना उदाहरण

CHAR *dsn_name = "Your DSN name"; 
CHAR db_name[20]; 
char *odbcini = NULL; 
odbcini = "odbc.ini"; 

SQLGetPrivateProfileString(dsn_name, (CHAR*)"DATABASE", (CHAR*)"", db_name, 
sizeof(db_name), odbcini); 

यह रजिस्ट्री प्रविष्टि HKEY_CURRENT_USER या HKEY_LOCAL_MACHINE या दोनों config मोड सेट पर निर्भर करता है (यह SQLSetConfigMode ODBC एपीआई का उपयोग कर सेट किया जा सकता) खोज करेंगे। यदि मोड स्पष्ट रूप से सेट नहीं है, तो यह HKEY_CURRENT_USER और HKEY_LOCAL_MACHINE दोनों को खोजेगा। अधिक जानकारी के लिए कृपया https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function देखें।

संबंधित मुद्दे