我们正在构建一个应用程序,该应用程序使用从第三方测试设备生成的excel文件。我相信用户可以在导出数据时在这些设备上指定csv,xls或xlsx。但是,我们已有的数据可能已经是xls。
当前,我们为此使用ExcelDataReader。它可以工作,但是我想查看ODBC连接是否会更快。考虑到我们正在使用的数据量,任何性能优势都将是不错的。我想天空是文件大小的限制。我知道我们已经至少有一个1gb + xls文件。
我安装了可再发行的64位2016访问数据库引擎,我相信它为我提供了正确的odbc驱动程序(Microsoft Excel驱动程序(* .xls,*。xlsx,*。xlsm,*。xlsb)版本16.00.4513.1000 )。
我正在使用以下代码:
var connectionString = $"Driver={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={filename}";
using (var conn = new OdbcConnection(connectionString))
{
conn.Open();
var schema = conn.GetSchema(OdbcMetaDataCollectionNames.Tables);
var sheetNames = schema.Rows.Cast<DataRow>()
.Select(p => p["TABLE_NAME"].ToString())
.ToList();
sheetNames.ForEach(Console.WriteLine);
}
尝试打开OdbcConnection时出现以下错误:
未处理的异常:System.Data.Odbc.OdbcException:错误[HY000] [Microsoft] [ODBC Excel驱动程序]常规错误无法打开注册表 密钥进程0x211c的临时(易失)Ace DSN线程0x3c6c DBC 0xc00d9298
Excel”。错误[IM006] [Microsoft] [ODBC驱动程序管理器]驱动程序的 SQLSetConnectAttr失败错误[HY000] [Microsoft] [ODBC Excel 驱动程序]常规错误无法打开注册表项临时(易失) Ace DSN用于进程0x211c线程0x3c6c DBC 0xc00d9298
Excel”。错误[HY000] [Microsoft] [ODBC Excel驱动程序]无法打开 数据库“(未知)”。您的应用程序可能不是数据库 识别,或者文件可能已损坏。错误[HY000] [Microsoft] [ODBC Excel驱动程序]常规错误无法打开注册表项临时 (易失)进程0x211c的Ace DSN线程0x3c6c DBC 0xc00d9298
Excel”。错误[HY000] [Microsoft] [ODBC Excel驱动程序]常规错误 无法打开注册表项临时(易失)Ace DSN以进行处理 0x211c线程0x3c6c DBC 0xc00d9298
Excel”。错误[HY000] [Microsoft] [ODBC Excel驱动程序]无法打开 数据库“(未知)”。您的应用程序可能不是数据库 识别,或者文件可能已损坏。
我发现了许多建议,例如:“General error Unable to open registry key Temporary (volatile) …” from Access ODBC,但似乎没有任何问题与我的问题相符。
我从一个电子表格开始,该电子表格包含11个工作表,大小约为440MB。对于电子表格来说,这似乎有点偏大,所以我认为这可能与文件大小,工作表数,行数或电子表格中某些不良数据的限制有关。
我开始删除工作表。最终,我发现文件只有前5个工作表,然后我的ODBC连接开始工作。
这时,文件大小减小到200MB左右。接下来,我认为第六个工作表可能存在错误/损坏。因此,我将其重新添加并删除了第一个工作表。而且处理得很好,因此第六个工作表上的数据没有问题。
然后我认为这必须是行数的限制或文件大小的限制。似乎大多数/所有工作表都是65532行和60列。因此,我以6个工作表示例(大约240MB且发生故障)为例,并删除了46列(额外的数据很重要,但仅次于要求)。这使它减少到大约84MB,并且ODBC连接成功。这使我相信这与工作表的数量或行数无关,而与文件大小无关。
因此,我想简单地说,在与XLS文件建立ODBC连接时,文件大小是否存在已知限制?好像可能在200MB到240MB之间。我已经在各种版本的Mirosoft软件的电子表格上发现了很多限制数据,但没有任何数据表明ODBC限制。