ODBC连接到Excel错误

时间:2015-10-04 22:26:41

标签: c# .net excel odbc

我遇到了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实际存在于我的硬盘上的证据:

additional_info

con.ToString()还提供以下内容:

Data Source="G:\POS\odabrane_skole novo_mod.xlsx";Driver="{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"

3 个答案:

答案 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驱动程序....