c# - 如何将 Oracle session 的全局化设置为与 .NET 中的 Windows 相同?

标签 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。

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

最佳答案

我认为您必须手动分配每个属性。 应该是这样的。

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)是只读的,这些值来自注册表或环境变量,并在打开连接时设置。

因此,首选方法是使用注册表或环境变量,这样就不必设置OracleGlobalization

关于c# - 如何将 Oracle session 的全局化设置为与 .NET 中的 Windows 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388534/

相关文章:

windows - 如何使 vcredist 成为我的 MSI 安装程序的启动条件?

oracle - ORA_HASH函数使用的算法是什么?

java - 错误 ORA-01000 : maximum open cursors exceeded

c# - Basedir的父目录——NLog配置

c# - sql 'timestamp' 列真的是 'byte[]' 吗?

python - Anaconda Prompt 和 Anaconda Powershell Prompt 有什么区别?

windows - 如何在Windows服务或NT服务中托管WCF?

sql - 循环运行大型 oracle SQL 脚本

javascript - 如何在 asp.net 中使用 ajax 调用上传文件?

c# - System.IO.FileNotFoundException : myCSharpDemoCalc\work\MyCSharpDemoCalc. j4n.dll