OleDbDatareader 十进制问题
Posted
技术标签:
【中文标题】OleDbDatareader 十进制问题【英文标题】:OleDbDatareader Decimal Issue 【发布时间】:2013-09-05 19:39:57 【问题描述】:我有一个制表符分隔的文本文件,其中一些十进制值的格式如下: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但它返回日期时间。
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
【问题讨论】:
【参考方案1】:刚刚解决了。 我不得不在我的 schema.ini 文件中添加更多的行,它试图确定文件中每一列的数据类型。知道了here
这两个宝宝成功了:
ColNameHeader=True
MaxScanRows=0
希望对你有帮助。
【讨论】:
【参考方案2】:“如何“强制”我的应用程序将逗号理解为数字的小数分隔符?”
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
decimal val = decimal.Parse("0,02");
上面的代码产生十进制值 0.02。
【讨论】:
好的,但我不想在数据读取器充满数据后进行转换。我希望它用正确的值填充 executereader。 那么你需要代替select *
做这样的事情:select functionConvertToDecimal(decimalField), anotherField, ... From...
【参考方案3】:
你需要其中之一
1.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("任何用逗号分隔小数点的文化");
-
2.
如果你在美国文化中
这是伪代码,不是精确的语法
decimal.Parse("0,02").Split(",").Join("."))
3.
您的文件是制表符分隔的。使用流将其加载到数据表中,而不是使用 OleDb
【讨论】:
1 - 没用。 2 - 如前所述,该值必须以正确的格式返回,因此,后期转换被丢弃。 3 - Datatable 是最初的解决方案并且正在工作(糟糕,糟糕的性能)。但是当文件超过 300.000 行时,它会抛出“OutOfMemoryException”,因此,数据表被丢弃。 请再读一遍。消息没有显示。您是否设置了逗号是小数分隔符的文化?您可以创建服务并将文件加载到 Sql Server 并从那里开始工作以上是关于OleDbDatareader 十进制问题的主要内容,如果未能解决你的问题,请参考以下文章
OleDbDataReader 看不到单元格中的数据 (.xlsx)
如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值