2013-03-01 37 views
5

Tôi có một ứng dụng Delphi 6 sử dụng DSN ODBC để kết nối với cơ sở dữ liệu đích. Tôi muốn bao gồm văn bản liệt kê tên của Cơ sở dữ liệu mà DSN được kết nối tới. Tôi đã thử bằng cách sử dụng lệnh SQL db_name() nhưng chỉ nhận được một nil trong phản ứng mặc dù có nó hoạt động khi tôi đăng nhập vào máy chủ SQL.Cần xác định tên cơ sở dữ liệu trong ứng dụng được kết nối DSN DSN

Có cách nào trong Delphi để xác định Cơ sở dữ liệu nào tôi được kết nối không? Tôi có thể kéo lên bảng sys.databases, nhưng tôi không chắc chắn làm thế nào để xác định được cơ sở dữ liệu là một trong tôi đang kết nối với

Là một Ví dụ:

nếu tôi kết nối với DSN LocalDSN tôi muốn có thể hiển thị cho người dùng rằng họ được kết nối với Cơ sở dữ liệu, trong đó cơ sở dữ liệu là tên của cơ sở dữ liệu sql mà họ đang liên lạc.

+4

Bạn không thể lấy tên DSN thông qua sql, vì AFAIK bản thân động cơ không biết các cơ chế bạn đang sử dụng để kết nối, nhưng bạn chắc chắn có thể lấy nó từ thuộc tính nơi nó nằm trong đối tượng kết nối bạn sử dụng. Ví dụ, nếu bạn sử dụng TSQLConnection, nó được lưu trữ trên các tham số. – jachguate

+0

Thật không may là đối tượng kết nối dường như chỉ có ba thuộc tính - tên của dsn và tên người dùng và mật khẩu của người dùng. Ứng dụng đang sử dụng đối tượng TQuery và TDatabase (cả từ vcl) nếu điều đó giúp – ChargerIIC

+0

@jachguate bạn nên làm cho câu trả lời đó. –

Trả lời

3

ODBC DSN được lưu trữ trong Windows Registry. Hãy ghi nhớ rằng Windows Registry, và do đó các thiết lập ODBC DSN, được tách ra giữa các phiên bản 32 và 64 bit. Bạn có thể truy cập thông tin này qua HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME] và sau đó đọc giá trị Database hoặc Server để biết tên cơ sở dữ liệu hoặc máy chủ.

Bạn có thể đọc các máy chủ và tên cơ sở dữ liệu với các chức năng:

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; 

Tùy thuộc vào những gì cơ sở dữ liệu và trình điều khiển bạn đang sử dụng, nội dung của khóa registry này có thể khác nhau, và do đó có một khả năng rằng Server hoặc Database có thể không phải là giá trị sổ đăng ký bạn cần, nhưng tự kiểm tra và tìm tên giá trị của bạn trong sổ đăng ký để biết cách đọc nó.

+0

LƯU Ý: Tôi chỉ bao gồm tên máy chủ vì có giải thích sai ban đầu về câu hỏi. Ban đầu tôi trả lời với tên máy chủ, và sau đó thêm tên cơ sở dữ liệu khi tôi nhận ra đó là những gì đã được hỏi. –

+0

Tìm thấy các thiết lập trong phần 64bit của hệ điều hành của tôi. Tôi sẽ có thể có ứng dụng kéo từ đó và vị trí 32bit cho tên cơ sở dữ liệu. Cảm ơn! – ChargerIIC

1

Bạn có thể sử dụng SQLGetPrivateProfileString ODBC API để lấy nội dung của DSN được tạo.

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

Ở đây,

lpszSection = phần registry bạn muốn chi tiết cho. nó sẽ là tên DSN trong trường hợp của bạn.

lpszEntry = khóa mà bạn muốn trích xuất giá trị. bạn muốn lấy thông tin tên cơ sở dữ liệu, do đó bạn cần kiểm tra mục đăng ký HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI [YOUR_DSN_NAME] để biết tên khóa để lưu trữ thông tin tên cơ sở dữ liệu là gì. Điều này là do trình điều khiển khác nhau có thể có tên khóa khác nhau để lưu trữ tên cơ sở dữ liệu.

lpszDefault = Giá trị mặc định cho khóa được chỉ định trong đối số cuối cùng (lpszEntry) nếu không tìm thấy khóa.

RetBuffer = Con trỏ tới bộ đệm đầu ra trong đó giá trị cho khóa được chỉ định được nhận.

cbRetBuffer = kích thước bộ đệm được trỏ bởi RetBuffer trong ký tự.

lpszFilename = Tên tệp nơi bạn tìm kiếm các mục nhập này. Nó sẽ là odbc.ini trong trường hợp của bạn.

dụ mẫu

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

Nó sẽ tìm kiếm registry entry HKEY_CURRENT_USER hoặc HKEY_LOCAL_MACHINE hoặc cả hai tùy thuộc vào các thiết lập chế độ cấu hình (Nó có thể được thiết lập sử dụng SQLSetConfigMode ODBC API). Nếu chế độ không được thiết lập rõ ràng, nó sẽ tìm kiếm cả HKEY_CURRENT_USER và HKEY_LOCAL_MACHINE. Vui lòng tham khảo https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function để biết thêm thông tin.

Các vấn đề liên quan