ODBC连接Excel错误

11
我遇到了一个与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] 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实际存在于我的硬盘上的证明:

additional_info

另外con.ToString()返回以下内容:

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

3
我真的不明白为什么有人会自讨苦吃。使用 microsoft.ace.oledb 来处理 Excel。 - T.S.
@T.S. 感谢你的建议。我肯定会尝试一下,但我仍然很好奇为什么这样不起作用。 - AbyPhantom
正如在评论中所指出的那样这里,您可能需要在Office位版本和修改Excel文件的应用程序之间具有兼容性(我自己对这些东西还是有点生疏,所以这可能没有什么意义,但我遇到了相同的错误)。 - horace_vr
你试过这个吗?http://www.c-sharpcorner.com/uploadfile/yougerthen/connect-to-an-excel-file-as-a-data-source-via-obdc/ - user3875617
3个回答

1

看起来你的应用程序是x86(32位)应用程序,而你正在查看64位ODBC驱动程序。请检查是否安装了32位ODBC驱动程序....


1

1
使用OleDbConnection怎么样,但是你首先需要安装Microsoft Access Database Engine 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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接