Попробуем открыть службой таблицу dbf. Для этого создадим, как было описано ранее, ещё один метод.
Вот его код:
public string StartLoad()
{
string result;
OleDbConnection conn = new OleDbConnection();
DataTable dt = new DataTable();
DataRow row;
DataColumn column = new DataColumn();
try
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\сервер\папка;Extended Properties=dBASE IV;User ID=;Password=;";
conn.Open();
OleDbCommand comm = conn.CreateCommand();
comm.CommandText = @"SELECT * FROM test_bs";
dt.Load(comm.ExecuteReader());
column = dt.Columns[0];
row = dt.Rows[0];
result = row[column].ToString();
}
catch (Exception e)
{
result = e.ToString();
}
finally
{
conn.Close();
}
return result;
}
Метод совершенно бесполезный, но демонстрирует принципы: работа идет через OleDb, в строке подключения указан путь к таблице, сама таблица - в исполняемом запросе. Результат запроса забрасывается в DataTable (просто для примера), оттуда извлекается одно значение и возвращается в виде строки. Все примитивно и не нуждается в особых комментариях.
Тем не менее, и тут есть пара тонкостей.
Во первых, Microsoft.Jet не будет работать с 64-х разрядным приложением. При выборе конкретного драйвера нужно не забывать этот момент. В данном случае это решается в два шага:
а - компиляция веб-службы в варианте конечной платформы = х86, Для этого нужно вызвать свойства проекта вебслужбы, перейти на вкладку "Построение" и выставить соответствующее значение в пункте "Конечная платформа".
б - разрешение пулу веб-службы работать с 32-х разрядными приложениями. Для этого нужно открыть дополнительные параметры нужного пула приложений и в пункте "Разрешены 32-разрядные приложения" выставить "true".
Во вторых, нужно помнить про ограничения конкретного драйвера. В данном случае интересно ограничение на длину имени таблицы, равное восьми символам (привет от dos-а). Соответственно, при попытке указать в select - те таблицу, чьё имя превышает 8 символов возникнет ошибка с сообщением, что ядру Microsoft.Jet не удается найти указанную таблицу.
В третьих, присутствуют глюки при совместном доступе к таблице. Есть немалая вероятность что если с таблицей уже работают несколько клиентов, то JET-товский драйвер не сможет её открыть. Можно использовать драйвер Visual FoxPro, но тут вылезают не менее приятные особенности - этот драйвер категорически не желает воспринимать кирилицу в старых dbf-ках. В принципе, если подправить им заголовок, то то он должен это делать, но на практике править таблицы далеко не всегда возможно. Этот момент подробнее рассмотрен здесь,
Вот его код:
public string StartLoad()
{
string result;
OleDbConnection conn = new OleDbConnection();
DataTable dt = new DataTable();
DataRow row;
DataColumn column = new DataColumn();
try
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\сервер\папка;Extended Properties=dBASE IV;User ID=;Password=;";
conn.Open();
OleDbCommand comm = conn.CreateCommand();
comm.CommandText = @"SELECT * FROM test_bs";
dt.Load(comm.ExecuteReader());
column = dt.Columns[0];
row = dt.Rows[0];
result = row[column].ToString();
}
catch (Exception e)
{
result = e.ToString();
}
finally
{
conn.Close();
}
return result;
}
Метод совершенно бесполезный, но демонстрирует принципы: работа идет через OleDb, в строке подключения указан путь к таблице, сама таблица - в исполняемом запросе. Результат запроса забрасывается в DataTable (просто для примера), оттуда извлекается одно значение и возвращается в виде строки. Все примитивно и не нуждается в особых комментариях.
Тем не менее, и тут есть пара тонкостей.
Во первых, Microsoft.Jet не будет работать с 64-х разрядным приложением. При выборе конкретного драйвера нужно не забывать этот момент. В данном случае это решается в два шага:
а - компиляция веб-службы в варианте конечной платформы = х86, Для этого нужно вызвать свойства проекта вебслужбы, перейти на вкладку "Построение" и выставить соответствующее значение в пункте "Конечная платформа".
б - разрешение пулу веб-службы работать с 32-х разрядными приложениями. Для этого нужно открыть дополнительные параметры нужного пула приложений и в пункте "Разрешены 32-разрядные приложения" выставить "true".
Во вторых, нужно помнить про ограничения конкретного драйвера. В данном случае интересно ограничение на длину имени таблицы, равное восьми символам (привет от dos-а). Соответственно, при попытке указать в select - те таблицу, чьё имя превышает 8 символов возникнет ошибка с сообщением, что ядру Microsoft.Jet не удается найти указанную таблицу.
В третьих, присутствуют глюки при совместном доступе к таблице. Есть немалая вероятность что если с таблицей уже работают несколько клиентов, то JET-товский драйвер не сможет её открыть. Можно использовать драйвер Visual FoxPro, но тут вылезают не менее приятные особенности - этот драйвер категорически не желает воспринимать кирилицу в старых dbf-ках. В принципе, если подправить им заголовок, то то он должен это делать, но на практике править таблицы далеко не всегда возможно. Этот момент подробнее рассмотрен здесь,
А что нужно подключать в заголовке? Какие сборки и спользовать?
ОтветитьУдалитьПишет Не удалось найти имя типа или пространства имен "OleDbConnection" (пропущена директива using или ссылка на сборку?)
ОтветитьУдалить