我遇到了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
消息:
错误[IM002] [Microsoft] [ODBC驱动程序管理器]数据源名称不是 找到并且没有指定默认驱动程序&#34;,这是奇怪的,因为我有 在名为con。
的字符串中指定的那些
值得一提的是,在ODBC数据源管理器中,我可以清楚地看到我安装并运行了这些驱动程序。
还有一个奇怪的部分。当我调用我在stackoverflow上找到的以下方法时,它返回以下驱动程序列表:
- &#34; Driver da Microsoft para arquivos texto(* .txt; * .csv)&#34;
- &#34;驱动程序执行Microsoft Access(* .mdb)&#34;
- &#34;驱动程序执行Microsoft dBase(* .dbf)&#34;
- &#34;驱动程序执行Microsoft Excel(*。xls)&#34;
- &#34;驱动程序执行Microsoft Paradox(* .db)&#34;
- &#34; Microsoft Access驱动程序(* .mdb)&#34;
- &#34; Microsoft Access-Treiber(* .mdb)&#34;
- &#34; Microsoft dBase驱动程序(* .dbf)&#34;
- &#34; Microsoft dBase-Treiber(* .dbf)&#34;
- &#34; Microsoft Excel Driver(* .xls)&#34;
- &#34; Microsoft Excel-Treiber(* .xls)&#34;
- &#34; Microsoft ODBC for Oracle&#34;
- &#34; Microsoft Paradox Driver(* .db)&#34;
- &#34; Microsoft Paradox-Treiber(* .db)&#34;
- &#34; Microsoft文本驱动程序( .txt; .csv)&#34;
- &#34; Microsoft Text-Treiber(* .txt; * .csv)&#34;
- &#34; SQL Server&#34;
- &#34; SQL Server Native Client 11.0&#34;
没有人拥有&#34; *。xlsx&#34;在它们中,这是我试图阅读的文件的格式。
方法如下:
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)}"
答案 0 :(得分:1)
确保您已下载并安装了Microsoft Access Database Engine 2010 Redistributable ....
将您的连接字符串更改为...
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\POS\odabrane_skole novo_mod.xlsx;Extended Properties="Excel 12.0;HDR=YES; IMEX=1;";
答案 1 :(得分:1)
如何使用OleDbConnection,首先必须安装Microsoft Access数据库引擎2010.
string path = @"c:\sample.xlsx";
string strCon = " Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + path + ";Extended Properties='Excel 12.0;'";
OleDbConnection objConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [a$] ";
objConn.Open();
答案 2 :(得分:1)
我看起来你的应用程序是一个x86(32位)应用程序,你正在看64位ODBC驱动程序。检查是否安装了32位ODBC驱动程序....