OleDbDatareader小数问题

时间:2013-09-05 19:39:57

标签: c# decimal comma oledbdatareader

我有一个制表符分隔的文本文件,其中包含一些十进制值:0,12(逗号为小数点分隔符)。 我通过Provider = Microsoft.Jet.OLEDB.4.0将其内容解析为OleDBDataReader,但是当我查看结果时,应该是十进制的值被转换为DateTime!

如何“强制”我的应用程序将逗号理解为数字的小数分隔符? 没有工作将cultureinfo更改为en-US或任何其他。

public static OleDbDataReader CriarOleDbDataReader(string sCaminhoArquivo)
    {
        FileInfo fi = new FileInfo(sCaminhoArquivo);

        string format;

        string linha;

        if (fi.Extension.ToLower().Equals(".csv"))
        {
            string texto = System.IO.File.ReadAllText(sCaminhoArquivo).Replace(',', ';');
            System.IO.File.WriteAllText(sCaminhoArquivo, texto);
            linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
            format = "Delimited(;)";
        }
        else
        {                
            linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
            format = (linha.Split('\t').Count() > 1) ? "TabDelimited" : "Delimited(;)";
        }

        DefinirSchema(fi, format);

        string cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fi.DirectoryName + ";Extended Properties='text;HDR=Yes';";

        OleDbConnection con = new OleDbConnection(cn);
        OleDbCommand cmd = new OleDbCommand("select * from [" + fi.Name + "]", con);
        OleDbDataReader dr;

        con.Open();

        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return dr;

    }

字段“IOF”是一个小数,它在.txt文件中的值是0,02,但它返回datetime。

dr["iof"]
{30/12/1899 00:02:00}
    Date: {30/12/1899 00:00:00}
    Day: 30
    DayOfWeek: Saturday
    DayOfYear: 364
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 2
    Month: 12
    Second: 0
    Ticks: 599264353200000000
    TimeOfDay: {00:02:00}
    Year: 1899

3 个答案:

答案 0 :(得分:1)

刚刚解决了。 我必须在schema.ini文件中添加更多行,它们尝试确定文件中每列的de数据类型。得到它here

这两个孩子做了这个伎俩:

ColNameHeader =真

的MaxScanRows = 0

希望它有所帮助。

答案 1 :(得分:0)

“如何”强制“我的应用程序将逗号理解为数字的小数分隔符?”

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
decimal val = decimal.Parse("0,02");

上面的代码生成小数值0.02。

答案 2 :(得分:0)

您需要其中一个

1

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“任何文化,其中小数以逗号分隔,而不是点”);

    2。

    如果你身处美国文化

    这是伪代码,而不是精确的语法

    decimal.Parse("0,02").Split(",").Join("."))
    

    3

    您的文件以制表符分隔。使用stream将其加载到datatable而不是使用OleDb