土耳其的DataTable Column CaseSensitive

时间:2018-08-08 12:58:58

标签: c# datatable .net-2.0

我在土耳其有一个客户,最近有一个问题,他不能使用我们的组件之一。该组件是用C#.Net 2.0编写的,并使用具有多列的DataTable。如果我通过计算机上的名称(Region Germany和Language German)访问列,则该组件有效。如果我在土耳其语计算机(Region Turkey和Türkçe语言)上执行组件,它将无法正确执行。

我将问题缩小到区分大小写。如果我按名称访问列,并且名称用大写字母而不是小写字母写,那么它在土耳其计算机上将失败。对我来说奇怪的是,它不会在我的计算机上失败。两台机器都是Windows 10。

我创建了一个示例来使此问题可重现。

class Program
{
    static void Main(string[] args)
    {
        DataSet set = GetDataSet();
        try
        {
            foreach (DataRow row in set.Tables[0].Rows)
            {
                String Directory = string.Format("{0}", row["component"]);
                String FileName = row["name"].ToString();
                String compBig = String.Format("{0}", row["compId"]); //here is the problem. I wrote the compId with an uppercase I instead of i

                String component = String.Format("{0}", row["component"]);
                String name = row["name"].ToString();
                String compSmall = row["compid"].ToString();
            }  
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();

    }

    private static DataSet GetDataSet()
    {
        DataSet set = new DataSet();

        DataTable workTable = new DataTable("Table0");

        workTable.Columns.Add("component", typeof(int));
        workTable.Columns.Add("name", typeof(String));
        workTable.Columns.Add("compid", typeof(Guid)); //Here is the compid with a lowercase i

        DataRow row = workTable.NewRow();
        row["component"] = 0;
        row["name"] = "AName";
        row["compid"] = Guid.NewGuid();

        workTable.Rows.Add(row);
        set.Tables.Add(workTable);
        return set;
    }
}

例外如下:

enter image description here

我的问题是:为什么在一种情况下区分大小写而在另一种情况下不区分大小写?

我现在通过将大写字母I更改为小写字母i(应该是一开始就应该解决了)来解决问题

--- 更新: ---

我现在已经尝试了几种CultureInfos

        CultureInfo culture;
        //uncomment to test
        culture = CultureInfo.CreateSpecificCulture("tr-TR"); //turkish fails
        //culture = CultureInfo.CreateSpecificCulture("he-IL"); //Hebrew works
        //culture = CultureInfo.CreateSpecificCulture("ar-SA"); //Arabic works
        //culture = CultureInfo.CreateSpecificCulture("en-GB"); //English works
        //culture = CultureInfo.CreateSpecificCulture("ru-RU"); //Russian works
        //culture = CultureInfo.CreateSpecificCulture("de-DE"); //German works
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

直到现在,土耳其语似乎是唯一失败的地方。

--- 更新 ---

我尝试了以下操作:

        culture = CultureInfo.CreateSpecificCulture("tr-TR"); //turkish fails
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        String ID = "ID";
        String idLower = "id";

        Console.WriteLine(ID.ToLower());
        Console.WriteLine(idLower.ToUpper());

        culture = CultureInfo.CreateSpecificCulture("el-GR"); //Greek works
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        Console.WriteLine(ID.ToLower());
        Console.WriteLine(idLower.ToUpper());

结果为:

enter image description here

在土耳其语中,大写字母“ I”的toLower()似乎不同于其他语言。

1 个答案:

答案 0 :(得分:1)

尝试使用土耳其语区域设置在字符串“ compID”上创建toLower()。如果返回“ compID”,则区分大小写的türkisch不同于西欧。实际上我无法检查它,因为我这里没有电脑。