среда, 1 февраля 2012 г.

WCF служба и файл DBF

    Попробуем открыть службой таблицу 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-ках. В принципе, если подправить им заголовок, то то он должен это делать, но на практике править таблицы далеко не всегда возможно. Этот момент подробнее рассмотрен здесь,

Похожие посты:

2 комментария:

  1. А что нужно подключать в заголовке? Какие сборки и спользовать?

    ОтветитьУдалить
  2. Пишет Не удалось найти имя типа или пространства имен "OleDbConnection" (пропущена директива using или ссылка на сборку?)

    ОтветитьУдалить