2014-06-19 18 views
5

Tôi có ứng dụng C# winforms sử dụng Oracle 12c thông qua oracle.manageddataaccess (qua NHibernate 4.0), Cơ sở dữ liệu oracle trên một máy khác trên trang web của khách hàng NLS_LANG khác biệt giữa cơ sở dữ liệu oracle và máy khách. Không có máy khách Oracle nào được cài đặt trên máy khách (chỉ sử dụng trình điều khiển được quản lý).Đặt NLS_LANG cho truy cập dữ liệu được quản lý oracle

Chúng tôi thấy rằng bạn có thể chỉ định NLS_LANG của khách hàng bằng biến môi trường.

Câu hỏi của tôi là: Có cách nào khác để chỉ định cài đặt NLS_LANG khi sử dụng Truy cập dữ liệu được quản lý mới trong Oracle không?

Trả lời

0

Không chắc về chính xác những gì bạn cần, (Thuật ngữ "mới quản lý truy cập dữ liệu trong Oracle" không rung chuông ở đây.) Nhưng tôi thấy điều này:

http://docs.oracle.com/html/E41125_02/featGlobal.htm#i1008314

Calling Oracle.DataAccess.Client.OracleConnection 's Phương thức GetSessionInfo() trả về một đối tượng của lớp Oracle.DataAccess.Client.OracleGlobalization, theo Hướng dẫn của nhà phát triển ODP.NET, có thể được sử dụng để thay đổi các thiết lập cụ thể của NLS ở cấp độ của một phiên Oracle DB.

3

Tôi đang sử dụng OracleGlobalization để đặt định dạng ngày như sau. Điều này có thể cung cấp cho bạn một đầu mối ..

conn = new OracleConnection(connectionString); 
     conn.Open(); 
     OracleGlobalization info = conn.GetSessionInfo(); 
     info.DateFormat = "YYYY-MM-DD"; 
     conn.SetSessionInfo(info); 
1

Bạn có thể muốn kiểm tra Windows Registry cho các phím NLS_LANG. Đặt khóa ít nhiều tương đương với thiết lập biến môi trường, nhưng nếu cả hai tồn tại biến môi trường sẽ được ưu tiên. câu hỏi StackOverflow này đã được một chút liên quan đến câu hỏi này:

Effects of changing NLS_LANG setting in the registry for Oracle Client

Trong phiên giao dịch cài đặt của tôi ngày hôm nay, chúng tôi phát hiện ra rằng ứng dụng Web của chúng tôi đang chạy trong chế độ 32-bit trên hệ điều hành 64-bit, vì vậy vị trí đăng ký đang được sử dụng khác với vị trí chuẩn. Nó nằm trong HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ KEY_OraClient11g_home1. Tôi sẽ đề nghị thực hiện tìm kiếm toàn cầu bằng cách sử dụng regedit để tìm ra các khóa NLS_LANG ở đâu.

+0

ODP.NET, trình điều khiển được quản lý không xem xét 'NLS_LANG' từ sổ đăng ký. Trên thực tế nó không xem xét cài đặt đăng ký ở tất cả. –

2

Không, đây là không thể, hãy xem tài liệu Data Provider for .NET Developer's Guide nơi nó nói

ODP.NET, Driver Managed không phải là NLS_LANG nhạy cảm. Nó chỉ là miền địa phương .NET nhạy cảm.

Xem thêm OracleGlobalization Properties

  • ClientCharacterSet ->public string ClientCharacterSet { get; }

    Chỉ định một bộ ký tự của khách hàng. Không Khả dụng trong ODP.NET, quản lý điều khiển

2

Vấn đề đặt ra khi bạn di chuyển từ không được quản lý để ODP quản lý. Dưới đây là phương pháp để thiết lập NLS_LANG bởi phần của nó để mở OracleConnection

 string nlsLang = Settings.Default.NLS_LANG; 
     var arr = nlsLang.Split('_'); 
     string language = arr[0]; 
     arr = arr[1].Split('.'); 
     string territory = arr[0]; 
     string characterSet = arr[1]; 

     OracleGlobalization info = connection.GetSessionInfo(); 
     info.Language = language; 
     info.Territory = territory; 
     info.NumericCharacters = characterSet; 
     connection.SetSessionInfo(info); 
0

Tôi đang sử dụng NHibernate, nhưng bạn có thể có thể chạy với bất cứ điều gì bạn đang sử dụng.

ALTER session SET nls_language = 'AMERICAN' 

Tôi thực hiện ngay sau khi mở kết nối cơ sở dữ liệu.

Khi đã xong, chạy trả về 'US'.

select USERENV('LANG') from dual; 

Và bạn có thể chạy này để có được một danh sách các giá trị có thể cho nls_language.

select * from V$NLS_VALID_VALUES where parameter = 'LANGUAGE' 
+0

Giải pháp này hóa ra không mạnh mẽ như tôi mong muốn. Tôi đã sử dụng cài đặt "Region and Language> Format" thành "English (United States)" để USERENV ('LANG') trả về 'US'. – yohosuff

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