2012-05-16 37 views
5

đây là vấn đề của tôi: Tôi đã có một chương trình trong C# sử dụng tệp ODP.NET: oci.dll, ociw32.dll, Oracle.DataAccess.dll, orannzsbb11.dll, oraocci11.dll, oraociicus11.dll, OraOps11w. dll.Cách thiết lập đường dẫn thích hợp cho tệp TNSNAMES trong ứng dụng C#?

Tôi có 2 máy tính. Đầu tiên với toàn bộ gói ODAC được cài đặt và thứ hai không có gói đó. Nhưng tôi có tất cả các dll yêu cầu trong thư mục exe của tôi, vì vậy ODAC không phải là một vấn đề (tôi nghĩ). Sự khác biệt giữa các máy tính này là đường dẫn đến tệp TNSNAMES. Đầu tiên: C: \ app \ OraHome_1 \ Network \ admin \ Thứ hai: C: \ Oracle \ product \ 11.2.0 \ client_1 \ network \ admin

Và trên chương trình cpu đầu tiên hoạt động tốt. Nhưng trên một thứ hai với cùng một chuỗi kết nối, connot kết nối mở (ORA-12154). Và sử dụng SQL Plus tôi có thể kết nối trên cả hai máy tính.

Vì vậy, làm thế nào tôi có thể hiển thị chương trình của mình đường dẫn thích hợp cho TNSNAMES?

+0

Đó là nơi khách hàng đã được cài đặt. – SQLMason

+1

vì vậy, ở khắp mọi nơi tôi muốn sử dụng chương trình của tôi, khách hàng phải được cài đặt trong cùng một vị trí? (có cùng một con đường)? – Marshall

Trả lời

11

Bạn có thể thiết lập các biến môi trường TNS_ADMIN lập trình. Xem trang này để biết số step by step. Đó là nếu bạn muốn thay đổi thành một tệp TNS_NAMES.ORA cụ thể. Khách hàng Oracle vẫn phải được cài đặt trên máy khách.

Từ ConnectionStrings - mà không sử dụng TNS:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword; 


EDIT: Thêm tùy chọn thứ 3

Hãy see this question mà có thể giúp bạn trong việc tìm kiếm vị trí hiện tại của tập tin TNS_NAMES.ORA của khách hàng - mà bạn có thể mở và sửa đổi nếu bạn muốn (thêm kết nối của riêng bạn nếu nó không tồn tại)

+0

Tôi cũng có ý tưởng từ @Marshall để không sử dụng TNS và kết nối bằng IP – SQLMason

+0

Cảm ơn, nhưng tôi cần tệp TNSNAMES - Tôi có nhiều .. nhiều cơ sở dữ liệu và đây là dự án rất năng động.Những người thêm và xóa cơ sở dữ liệu từ đó.Nhưng dù sao: tôi cần tệp tnsname, tôi có nhiều máy tính với (perheps) đường dẫn khác nhau đến oracle khách hàng và không có ODP.NET được cài đặt, và tôi có chương trình trong C#, sử dụng các dll này: dlls: oci.dll, ociw32.dll, Oracle.DataAccess.dll, orannzsbb11.dll, oraocci11.dll, oraociicus11.dll, OraOps11w. Vì vậy, giải pháp với biến TNS_ADMIN sẽ là ok, phải không? – Marshall

+0

Nếu bạn đang cài đặt tệp TNS_NAMES.ORA của riêng bạn (gửi cùng với bản cài đặt), bạn * có thể * làm điều đó. Tuy nhiên, bạn có thể làm hỏng các mục nhập của người khác - nếu họ có các mục tùy chỉnh riêng của họ. y sẽ được kết nối bằng IP nếu có thể, biến môi trường là một tùy chọn trả lời cụ thể câu hỏi của bạn. – SQLMason

3

Bạn không cần phải quan tâm đến đường dẫn tệp TNSNames của bạn: nó sẽ tự động được phát hiện bởi chính thư viện ... sau khi bạn đã cài đặt nó. Đó là điểm mấu chốt: phân phối dll trong dự án của bạn là không đủ. Bạn cần phải cài đặt ODP.Net trên máy cần sử dụng nó: thực sự việc cài đặt chỉ đơn giản là tạo một vài mục đăng ký, và một trong số chúng trỏ tới đúng oracle dir (trong đó thư viện có thể tìm ra tnsnames khi cần).

Morover, như ai đó đã chỉ ra, bạn không cần tệp tnsnams chút nào. Bạn có thể viết mọi thứ cần thiết bên trong chuỗi kết nối. Dưới đây là một tôi sử dụng trong môi trường của tôi:

Data Source= (DESCRIPTION = 
     (ENABLE = BROKEN) 
     (ADDRESS_LIST = 
     (LOAD_BALANCE = ON) 
     (FAILOVER = ON) 
     (ADDRESS = (PROTOCOL = TCP)(Host =por10srv-a)(Port = 1521)) 
    ) 
     (CONNECT_DATA = 
     (SERVICE_NAME = por10.gruppo.autostrade.it) 
     (FAILOVER_MODE = 
     (TYPE = SELECT) 
     (METHOD = BASIC) 
     (RETRIES = 10) 
     (DELAY = 3) 
    ) 
    ) 
    );User ID=npa_collaudo;Password=npa_collaudo; 
+0

Vâng .. Tôi nghĩ rằng cài đặt ODP.NET là không cần thiết. Tôi đã .. Tôi đang cố gắng để tránh cài đặt nó. Nhưng bây giờ .. tôi không chắc chắn – Marshall

+0

Nhìn vào bình luận của tôi để trả lời của Dan Andrews. – Marshall

+0

Bạn luôn cần TNSNAMES.ORA nếu bạn muốn dựa vào cấu hình của máy trạm ... Kinh nghiệm của tôi cho thấy cách tốt nhất để làm như vậy là lặp qua các mục Environment.Path và nối thêm "\ .. \ Network \ ADMIN \ TNSNAMES.ORA "để tìm ra đúng loại được sử dụng bởi InstantClient. Đây có vẻ là cách có giá trị nhất để tìm ra chúng tôi đang sử dụng. – menssana

2

Bạn không cần phải cài đặt ODP.NET (hoặc cho vấn đề đó là Oracle Client) vì bạn dường như có các DLL cần thiết cho một máy khách oracle nội bộ có thể phân phối cục bộ. Trong trường hợp của bạn, có thể có tệp TNSNAMES.ORA nằm trong cùng một thư mục với tệp thực thi của bạn và "khách hàng nội tuyến oracle" chuyên dụng của bạn sẽ nhận tệp đó từ đó. Nếu không, ứng dụng oracle local vào ứng dụng của bạn sẽ cố gắng lấy nó từ bất kỳ máy khách nào được cài đặt trên máy.

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