OleDbDatareader Decimal Issue

本文关键字:Issue Decimal OleDbDatareader | 更新日期: 2023-09-27 18:30:30

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

如何"强制"我的应用程序将逗号理解为数字的小数点分隔符?无法将文化信息更改为 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,但它返回日期时间。

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

OleDbDatareader Decimal Issue

刚刚解决了。我不得不在我的 schema.ini 文件中添加更多行,该文件试图确定文件中每一列的 de 数据类型。在这里得到它

这两个婴儿做到了:

ColNameHeader=True

最大扫描行数=0

希望对您有所帮助。

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

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

上面的代码生成十进制值 0.02。

你需要其中之一

1.

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("任何用逗号分隔的小数点而不是点的区域性");

    2.

如果您属于美国文化

这是伪代码,不是确切的语法

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

3.

您的文件是制表符分隔的。使用流将其加载到数据表中,而不是使用 OleDb