我遇到了一个与ODBC连接相关的问题,它应该连接到Excel表并对其进行操作。我已经在互联网上阅读了很多关于它的信息,但是没有一个解决方案能帮助我(包括stackoverflow)。
所以基本上,我现在正在尝试打开到表的连接。
当我调用
值得一提的是,在ODBC数据源管理器中,我可以清楚地看到已安装和运行这些驱动程序。
还有另一个奇怪的部分。当我调用在stackoverflow上找到的以下方法时,它会返回以下驱动程序列表:
"Microsoft文本文件驱动程序(*.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 Server" "SQL Server Native Client 11.0"
"这些中没有“*.xlsx”格式的驱动程序,而我正在尝试读取该格式的文件。"
"方法如下:"
请注意,当我实际进入注册表并查找这些值时,我清楚地看到:
我错过了什么明显的东西吗?请帮帮我 :)
顺便说一下,我对.NET这一方面还比较新,所以请回答时保持简单易懂,这样我才能理解发生了什么。谢谢!
编辑: 朋友指出我应该提供更多信息,所以这里是regedit、ODBC数据源管理员的屏幕截图和ACEODBC.DLL实际存在于我的硬盘上的证明:
所以基本上,我现在正在尝试打开到表的连接。
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] Data source name not found and no default driver specified”,这很奇怪,因为我已经在名为con的字符串中指定了它们。值得一提的是,在ODBC数据源管理器中,我可以清楚地看到已安装和运行这些驱动程序。
还有另一个奇怪的部分。当我调用在stackoverflow上找到的以下方法时,它会返回以下驱动程序列表:
"Microsoft文本文件驱动程序(*.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 Server" "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;
}
请注意,当我实际进入注册表并查找这些值时,我清楚地看到:
"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.