如何防止ADO.NET在从Excel文件中读取时更改double值

时间:2010-06-03 16:58:30

标签: c# excel ado.net

我的Excel输入文件中有以下行:

Column1       Column2
0-5           3.040 
6             2.957 
7             2.876

以及使用ADO.NET读取它的以下代码:

string fileName = "input.xls";
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);
var dbConnection = new OleDbConnection(connectionString);
dbConnection.Open();
try
{
    var dbCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", dbConnection);
    var dbReader = dbCommand.ExecuteReader ();

    while (dbReader.Read())
    {
        string col1 = dbReader.GetValue(0).ToString();
        string col2 = dbReader.GetValue(1).ToString();                 
    }                
}
finally
{
    dbConnection.Close();
}

结果非常令人不安。原因如下:

第一次循环中每列的值:

col1 is empty (blank)

col2 is 3.04016411633586

第二次:

col1 is 6

col2 is 2.95722928448829

第三次:

col1 is 7

col2 is 2.8763272933077

第一次迭代中第一个问题发生在col1上。我希望 0-5 。第二个问题发生在使用col2的每次迭代中,其中ADO.NET显然会在读取值时更改值。如何阻止这种恶意行为?

3 个答案:

答案 0 :(得分:4)

默认情况下,ADO.NET根据前8行中的多数类型推断列类型,假设多数类型获胜,如果有多个类型(如果是平局则为数字),并为任何行返回NULL与该列的推断数据类型不匹配。有关此问题的一些注意事项以及如何解决此问题,请参阅here。简而言之:

  • 在连接字符串中添加“IMEX = 1”属性。

  • 在注册表中,设置以下键:

Hkey_Local_Machine / Software / Microsoft / Jet / 4.0 / Engines / Excel / ImportMixedTypes =“Text” Hkey_Local_Machine / Software / Microsoft / Jet / 4.0 / Engines / Excel / TypeGuessRows = 0

这告诉ADO假设一个文本数据类型,如果它无法决定,并扫描前16384行(在以前版本的Excel中,这是所有行......)来推断类型。

答案 1 :(得分:1)

double类型是大多数数字的近似值,您可以看到col2中近似值的更多小数。只需将其作为double读取并将其转换为小数点后3位数的字符串表示,它们将匹配。

string col1 = dbReader.GetString(0);
var col2Value = dbReader.GetDouble(1);
string col2 = col2Value.ToString("F3");

答案 2 :(得分:1)

尝试做:

string col1 = dbReader.GetString(0); 
string col2 = dbReader.GetDecimal(1).ToString();  

您可以选择格式化ToString以适合您的展示方式:

string col2 = dbReader.GetDecimal(1).ToString("0.000");