Проблема здесь в том, что для такого типа файлового соединения провайдеру OleDb нужен, как вы уже нашли, абсолютный путь к файлу. Исторически , мы сделали это с Server.MapPath
, и в этом случае вы бы сделали что-то вроде:
<connectionstrings>
<add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;"/>
</connectionstrings>
String connString;
OleDbConnection conn;
connString = Web.Configuration.WebConfigurationManager.ConnectionStrings["xls"].ConnectionString;
connString = connString + Server.MapPath("~/App_Data/HPM_DB.xls");
conn = new OleDbConnection(connString);
conn.Open();
...
, который работает, но вам нужно либо делать все это каждый раз, когда вы хотите открыть соединение и запрашивать данные, либо разбить его на класс фабрики соединений.
Более аккуратный способ сделать это так:
<connectionstrings>
<add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;
Data Source=|DataDirectory|\HPM_DB.xls;"/>
</connectionstrings>
OleDbConnection conn;
conn = new OleDbConnection(Web.Configuration.WebConfigurationManager.ConnectionStrings["xls"].ConnectionString);
conn.Open();
...
Во время выполнения токен |DataDirectory|
в строке подключения действует как макрос, который молча делает все эти Server.MapPath
вещи для вас.