如何将我的Oracle会话的全球化设置为与.NET中的Windows相同?

时间:2015-04-01 10:33:33

标签: c# windows oracle globalization odp.net

例如,如果我能做到以下几点就会很棒:

private void SetSessionGlobalization(Oracle.DataAccess.Client.OracleConnection aConnection)
{
    System.Globalization.CultureInfo lCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
    aConnection.SetSessionInfo(lCultureInfo);
}

但这不起作用,因为SetSessionInfo将OracleGlobalization类作为参数,而不是CultureInfo!

这也不起作用:

private void SetSessionGlobalization(Oracle.DataAccess.Client.OracleConnection aConnection)
{
    Oracle.DataAccess.Client.OracleGlobalization lClientGlobalization = Oracle.DataAccess.Client.OracleGlobalization.GetClientInfo());
    aConnection.SetSessionInfo(lClientGlobalization);
}

因为GetClientInfo获得了客户全球化设置的Oracle版本,而不是Windows。

我在这里缺少什么?如何将我的数据库连接会话设置为与我的线程使用的相同(默认情况下与Windows相同)?

1 个答案:

答案 0 :(得分:1)

我认为您必须手动分配每个属性。 就像这样。

private void SetSessionGlobalization(Oracle.DataAccess.Client.OracleConnection aConnection)
{

     OracleGlobalization info = aConnection.GetSessionInfo();
     System.Globalization.CultureInfo lCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
     var ri = new System.Globalization.RegionInfo(lCultureInfo.LCID);

     info.Calendar = lCultureInfo.Calendar.GetType().Name.Replace("Calendar", String.Empty);         
     info.Currency = ri.CurrencySymbol;
     info.DualCurrency = ri.CurrencySymbol;
     info.ISOCurrency = ri.ISOCurrencySymbol;
     info.DateFormat = lCultureInfo.DateTimeFormat.ShortDatePattern + " " + lCultureInfo.DateTimeFormat.ShortTimePattern.Replace("HH", "HH24").Replace("mm", "mi");
     info.DateLanguage = System.Text.RegularExpressions.Regex.Replace(lCultureInfo.EnglishName , @" \(.+\)",String.Empty);
     info.NumericCharacters = lCultureInfo.NumberFormat.NumberDecimalSeparator + lCultureInfo.NumberFormat.NumberGroupSeparator;
     info.TimeZone = String.Format("{0}:{1}", TimeZoneInfo.Local.BaseUtcOffset.Hours,  TimeZoneInfo.Local.BaseUtcOffset.Minutes);
     info.Language = ...
     info.Territory = ...
     info.TimeStampFormat = ...
     info.TimeStampTZFormat = ...

     try {
        aConnection.SetSessionInfo(info);
     } catch ( OracleException err ) {
        MessageBox.Show(err.Message);
     }
}

您必须使用多种翻译,例如:用于日期格式或区域/语言。我希望你知道该怎么做。

注意一些(重要的)设置(例如ClientCharacterSet)是Read / only,这些值是从Registry或Environment变量派生的,并在打开连接时设置。

因此,首选方法是使用Registry或Environment变量,然后您不必设置OracleGlobalization