在c#应用程序中设置语言

本文关键字:设置 语言 应用程序 | 更新日期: 2023-09-27 18:21:38

我在MySQL数据库上连接的c#应用程序中遇到设置语言问题。

使用的服务器是英文版的Windows server 2003。

我需要用德语设置查询的输出。

我在MySQL数据库中尝试了查询序列,结果是正确的。

mysql> SET lc_time_names = 'de_DE';
SELECT
    CONCAT(
        MONTHNAME(
            STR_TO_DATE(Eng_Month, '%Y-%m')
        ),
        ' ',
        YEAR (
            STR_TO_DATE(Eng_Month, '%Y')
        )
    ) AS DE_Date
FROM
    tbl_month;
Query OK, 0 rows affected
+-----------+
| DE_Date   |
+-----------+
| Juni 2014 |
| Juli 2014 |
+-----------+
2 rows in set

如果在c#应用程序中尝试相同的解决方案,则输出仅为英文。

这开始让我相信我的整体结构是不正确的。

我错过了什么?

在解决这个问题时,如果你能给我任何帮助,我将不胜感激。

我下面的代码:

   protected override void InitializeCulture()
    {
        Page.Culture = "de-DE";
        Page.UICulture = "de-DE";
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            InitializeCulture();
            MonthLanguage();
            GridViewBind();
            Response.Write(Page.Culture + "<br />");
            Response.Write("Your current culture: " + System.Globalization.CultureInfo.CurrentCulture.DisplayName + "<br />");
        }
    }
   protected void MonthLanguage()
    {
        using (OdbcConnection cn =
            new OdbcConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
        {
            sql = " SET lc_time_names = 'de_DE'; "; 
            using (OdbcCommand command =
                new OdbcCommand(sql, cn))
            {
                try
                {
                    command.Connection.Open(); 
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw new ApplicationException("operation failed!", ex);
                }
                finally
                {
                    command.Connection.Close();
                }
            }
        }
    }

    public DataTable GridViewBind()
    {
        sql = " ... ";
        try
        {
            dadapter = new OdbcDataAdapter(sql, cn);
            dset = new DataSet();
            dset.Clear();
            dadapter.Fill(dset);
            DataTable dt = dset.Tables[0];
            GridView1.DataSource = dt;
            GridView1.DataBind();
            return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            dadapter.Dispose();
            dadapter = null;
            cn.Close();
        }
    }

在c#应用程序中设置语言

只需在与查询相同的连接中执行SET lc_time_names。您可以让MonthLanguage接受连接的参数,然后在用于查询的连接上调用它。

protected void MonthLanguage( OdbcConnection conn )
{
    var sql = " SET lc_time_names = 'de_DE'; "; 
        using (OdbcCommand command =
            new OdbcCommand(sql, conn ))
        {
            try
            {
                command.Connection.Open(); 
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("operation failed!", ex);
            }
        }
}
public DataTable GridViewBind()
{
    sql = " ... ";
    using( var cn = new OdbcConnection(
           ConfigurationManager.ConnectionStrings["cn"].ConnectionString) )
    {
        try
        {
             MonthLanguage( cn ); // This sets the language for this connection
             dadapter = new OdbcDataAdapter(sql, cn);
             dset = new DataSet();
             dset.Clear();
             dadapter.Fill(dset);
             DataTable dt = dset.Tables[0];
             GridView1.DataSource = dt;
             GridView1.DataBind();
             return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            dadapter.Dispose();
            dadapter = null;
            cn.Close();
        }
    }
}

您的MonthLanguage创建一个连接,设置语言,然后关闭连接,从而失去设置语言的效果。当您填充数据集时,它会使用一个具有默认语言的新连接。你可以尝试几种方法:

在GridViewBind中,将您的SQL设置为:

sql = "SET lc_time_names = 'de_DE'; Select .....";

(这在SQL Server中可以工作;我不知道MySQL。)

或者,只需从SQL返回基本DateTime列,并在C#代码中使用正确的语言区域设置,即可根据需要对其进行格式化。

使用RazorView/c#在MySQL中解决。

参见示例:

var tmp_data = db.Query("SET lc_time_names = 'it_IT'; SELECT MONTHNAME(yourdate) AS MONTH FROM orders GROUP BY MONTH(yourdate), YEAR(yourdate) ORDER BY  yourdate DESC");