Подключение ODBC к ошибке Excel
У меня возникла проблема с подключением 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 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] Имя источника данных не найдено и не указан драйвер по умолчанию ", что является нечетным, потому что у меня есть те, которые указаны в строке с именем con.
Также стоит упомянуть, что в ODBC Data Source Administrator я могу ясно видеть, что у меня установлены и запущены эти драйверы.
Есть и другая нечетная часть. Когда я вызываю следующий метод, который я нашел в stackoverflow, он возвращает мне следующий список драйверов:
- "Драйвер da Microsoft для arquivos texto (*.txt; *.csv)"
- "Драйвер делает Microsoft Access (*.mdb)"
- "Драйвер do Microsoft dBase (*.dbf)"
- "Драйвер делает Microsoft Excel (*. xls)"
- "Драйвер делает Microsoft Paradox (*.db)"
- "Microsoft Access Driver (*.mdb)"
- "Microsoft Access-Treiber (*.mdb)"
- "Microsoft dBase Driver (*.dbf)"
- "Microsoft dBase-Treiber (*.dbf)"
- "Драйвер Microsoft Excel (*.xls)"
- "Microsoft Excel-Treiber (*.xls)"
- "Microsoft ODBC для Oracle"
- "Microsoft Paradox Driver (*.db)"
- "Microsoft Paradox-Treiber (*.db)"
- "Microsoft Text Driver (.txt;.csv)"
- "Microsoft Text-Treiber (*.txt; *.csv)"
- "SQL Server"
- "Собственный клиент SQL Server 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, поэтому, пожалуйста, держите свои ответы в тупике, чтобы я мог понять, что происходит. Спасибо!
EDIT:
Друг указал, что я должен предоставить дополнительную информацию, так что вот скриншот Regedit, ODBC Data Source Administrator и доказательство того, что ACEODBC.DLL на самом деле существует на моем жестком диске:
![дополнительная_info]()
Также con.ToString()
дает следующее:
Data Source="G:\POS\odabrane_skole novo_mod.xlsx";Driver="{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"
Ответы
Ответ 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;";
Ответ 2
Как об использовании 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();
Ответ 3
Похоже, ваше приложение представляет собой приложение x86 (32bit), и вы смотрите на 64-битный драйвер ODBC. Проверьте, установлен ли 32-разрядный драйвер ODBC....