代码之家  ›  专栏  ›  技术社区  ›  Ray Hayes

Excel DateTime返回为DBNull

  •  1
  • Ray Hayes  · 技术社区  · 16 年前

    我有一些使用OLEDB的Excel文件读取代码( Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0; )这很好,但我一直遇到一个问题,即某些日期返回为DBNull。

    在原始XLS文档中,有效日期的格式(en GB语言环境)为:

    "02/04/2009  17:00:00" // returned as a System.DateTime
    

    但以下样式失败:

    "08/Jan/09 11:24 AM" // returned as DBNull
    

    =DATE(YEAR(c),MONTH(c),DAY(c))  // where c = cell reference.
    

    有没有办法,, 不改变自动生成的原始文件 ,以获取数据?


    作为参考,这里是我的read data方法(假设已经设置了dbAdapter——注意DBNull不是来自根本没有触发的catch):

        public List<List<string>> GetData(string tableName, int maxColumns)
        {
            List<List<string>> rows = new List<List<string>>();
    
            DataSet ExcelDataSet = new DataSet();
            dbCommand.CommandText = @"SELECT * FROM [" + tableName + "]";
            dbAdapter.Fill(ExcelDataSet);
    
            DataTable table = ExcelDataSet.Tables[0];
    
            foreach (DataRow row in table.Rows)
            {
                List<string> data = new List<string>();
    
                for (int column = 0; column < maxColumns; column++)
                {
                    try
                    {
                        data.Add(row[column].ToString());
                    }
                    catch (Exception)
                    {
                        data.Add(null);
                    }
                }
    
                //  Stop processing at first blank row
                if ( string.IsNullOrEmpty(data[0]) ) break;
                rows.Add(data);
            }
    
            return rows;
        }
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Chris Shaffer    16 年前

    我不知道这是否有帮助,但我遇到了Excel OLEDB代码返回空值的问题,在这里我需要数据,它几乎总是返回到数据类型推断问题。Excel根据前x行数据确定列的数据类型(我认为x=10,可能是错误的)。我知道您不想更改文件,但可能值得尝试将问题日期样式放在前10行,看看它是否会更改应用程序的行为。

    显然,如果它确实解决了问题,那么这并不能解决你的问题。据我所知,在这种情况下,唯一的修复方法是修改文件(在前10行中放入一些内容,强制它使用正确的数据类型)。很抱歉,我无法提供更好的解决方案,但希望至少我能帮助您找出导致问题的原因。