【发布时间】:2015-10-04 22:26:40
【问题描述】:
我的 ODBC 连接出现问题,该连接应该连接到 Excel 表并对其进行处理。我已经在互联网上阅读了很多关于它的内容,但没有一个解决方案对我有帮助(包括 stackoverflow)。
所以基本上我正试图打开与表的连接。
private static SortedList<string, School> generateSchoolListExcel(string listFilePath)
{
StringBuilder con = new StringBuilder();
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Data Source", listFilePath);
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "HDR", "yes");
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Format", "xlsx");
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Driver", "{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}");
//I have tried to specify driver without parentheses {} but it's still the same
List<School> schoolList = new List<School>();
using (OdbcConnection excel = new OdbcConnection(con.ToString()))
{
excel.Open();
//doing actuall stuff
}
return schoolList;
}
当我调用excel.Open() 方法时,我得到OdbcException 并带有消息:
ERROR [IM002] [Microsoft][ODBC Driver Manager] 数据源名称不正确 找到并且没有指定默认驱动程序”,这很奇怪,因为我有 在名为 con 的字符串中指定的那些。
还值得一提的是,在 ODBC 数据源管理器中,我可以清楚地看到我已经安装并运行了这些驱动程序。
还有另一个奇怪的部分。当我调用在 stackoverflow 上找到的以下方法时,它会返回以下驱动程序列表:
- “驱动程序 da Microsoft para arquivos texto (*.txt; *.csv)”
- “Microsoft Access 驱动程序 (*.mdb)”
- “Microsoft dBase (*.dbf) 驱动程序”
- “驱动执行 Microsoft Excel(*.xls)”
- “驱动执行 Microsoft Paradox (*.db)”
- “Microsoft Access 驱动程序 (*.mdb)”
- “Microsoft Access-Treiber (*.mdb)”
- “Microsoft dBase 驱动程序 (*.dbf)”
- “Microsoft dBase-Treiber (*.dbf)”
- “Microsoft Excel 驱动程序 (*.xls)”
- “Microsoft Excel-Treiber (*.xls)”
- “Microsoft ODBC for Oracle”
- “Microsoft Paradox 驱动程序 (*.db)”
- “Microsoft Paradox-Treiber (*.db)”
- “Microsoft 文本驱动程序 (.txt;.csv)”
- “Microsoft Text-Treiber (*.txt; *.csv)”
- “SQL 服务器”
- “SQL Server Native Client 11.0”
其中没有一个包含“*.xlsx”,这是我正在尝试读取的文件的格式。
方法如下:
public static List<String> GetSystemDriverList()
{
List<string> names = new List<string>();
// get system dsn's
Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.LocalMachine).OpenSubKey("Software");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC");
if (reg != null)
{
reg = reg.OpenSubKey("ODBCINST.INI");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC Drivers");
if (reg != null)
{
// Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
foreach (string sName in reg.GetValueNames())
{
names.Add(sName);
}
}
try
{
reg.Close();
}
catch { /* ignore this exception if we couldn't close */ }
}
}
}
return names;
}
需要注意的是,当我实际转到regedit 并找到我清楚地看到的那些值时:
"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)".
我是否遗漏了一些明显的东西?请帮帮我:)
顺便说一句,我对 .NET 的这一方面还很陌生,所以请保持你的答案简单明了,这样我才能真正理解发生了什么。谢谢!
编辑: 一位朋友指出我应该提供更多信息,所以这里是 regedit、ODBC 数据源管理器的屏幕截图以及 ACEODBC.DLL 实际存在于我的硬盘上的证明:
con.ToString() 还提供以下信息:
Data Source="G:\POS\odabrane_skole novo_mod.xlsx";Driver="{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"
【问题讨论】:
-
我真的不明白为什么人们会殴打自己。使用
microsoft.ace.oledb使用 Excel -
@T.S.谢谢你的主意。我一定会在某个时候尝试一下,但我仍然很好奇为什么这不起作用。
-
@AbyPhantom:正如 cmets 中的here 所指出的,您可能需要在 Office 位版本和用于修改 excel 文件的应用程序之间具有兼容性(我自己是个菜鸟对这些东西,所以这可能没有多大意义,但我有同样的错误)