Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VC-ODBC-MySQL  (Прочитано 22598 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kuzmich
Гость
« : 26-11-2003 09:13 » 

Вот, решил занятся MySQL...
С базой работаю через ODBC, но у меня появляется ошибка "Драйвер ODBC не поддерживает динамических подмножеств данных", можно конечно сделать snapshot вместо dynaset, но меня это не устраивает. Может я драйвер не тот использую. Причем тот же самый код в Access'е работает нормально. Помогите пожалуйста (драйвер где взять нормальный), либо я чето нетак делаю, в общем любая умная мысль приветствуется плюсами.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 26-11-2003 09:24 » 

Дело не в драйвере, а в самом MySQL. В ней многое, что есть в коммерческих базах, не реализованно. Уточнить что есть, а чего нет можно на http://www.mysql.com .
Как я понимаю, "dynaset" - это другое название курсоров. Этого пока нет. Если объяснишь в чем их особенная польза, то я попробую объяснить как работать без них.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #2 : 26-11-2003 10:28 » 

Цитата: RXL
Дело не в драйвере, а в самом MySQL.

да скорее всего в драйвере, или в моих кривых руках
Цитата
Как я понимаю, "dynaset" - это другое название курсоров. Этого пока нет. Если объяснишь в чем их особенная польза, то я попробую объяснить как работать без них.
VC предоставляет два метода работы с БД:
snapshot - снимки, загружает все данные из таблицы в память, потом операции производятся над данными в памяти, по окончании работы возвращаются обратно в базу, если за это время данные в базе поменял кто-то другой, будет крестец.
dynaset - динамические множества, работает с данными в "on-line режиме"
Просто для работы с БД в VC есть класс CRecordset, я пользую его, в API копаться неохота.[/quote]
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 26-11-2003 11:28 » 

Нет такого в MySQL и на драйвер грешить не надо. Все эти сервисные штучки ведут к потери производительности и достаточно сложны в реализации, потому они только в планах на реализацию в будующих версиях MySQL...

API у MySQL очень простое и долго "разбираться" там не придется. Я бы сказал элементарное. И опять же скорость работы повышается, чем через прослойку ODBC работать.

Для контроля за изменением можно применять следующие приемы:
1) при коротких транзакциях (SELECT, изменение и сразу UPDATE) можно делать блокировку таблиц  или строк (поддержка этого зависит от типа базы).
2) при большом времени между SELECT и UPDATE: зависит от правил совместной работы с таблицами. Можно переодически перечитывать на предмет оновлений, можно проверять на обновление перед UPDATE (чтобы чужии изменения не затереть). Вариантов много.

Кстати, надеюсь, MySQL используется не как excel, простой набор табличек, которые целиком скачиваются для местной работы?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #4 : 28-11-2003 06:14 » 

скачал с mysql.com последнюю версию драйвера ODBC, dynaset'ы он тоже не держит. Мне нужен совет как работать с БД(mysql, interbase) из MSVC ?. На данный момент есть несколько вариантов:
1. использовать ODBC через snapshot'ы
2. использовать DAO
3. использовать OLE DB
4. напрямую работать с базой
вот незнаю что лучше и не потеряет актуальность со временем
зы. заранее спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 28-11-2003 08:54 » 

Из задачи надо исходить - опиши ее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #6 : 28-11-2003 10:29 » 

Цитата: RXL
Из задачи надо исходить - опиши ее.
Да нету пока задачи, просто тренируюсь....
RXL расскажи пожалуйста про API MySQL Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 28-11-2003 11:15 » 

Опишу в кратце API для С.
Есть несколько типов:
MYSQL - handle соединения,
MYSQL_RES - handle для результирующего набора (result),
MYSQL_ROW - "This is a safe-type representation of one row of data." (по сути, char**) - используется при выборке строки из MYSQL_RES,
MYSQL_FIELD - описание одного поля в MYSQL_RES,
и еще нескольких редко употребимых.

Небольшой примерчик:
Код:
#include <stdio.h>
#include <mysql/mysql.h>

void print_error(MYSQL *con) {
  printf("ERROR: mysql_real_query(): #%u ($s)\n",mysql_errno(con),mysql_errstr(con));
  }

int main() {
  MYSQL *con;
  MYSQL_RES *res;
  MYSQL_ROW row;
  char *q="SHOW TABLES";
  int rows,cols,i;

  con=mysql_init(0);
  if(!mysql_real_connect(con,"localhost","user","pass","test_db",0,0,0)) print_error(con);
  else if(!mysql_real_query(con,q,strlen(q))) {
    if(res=mysql_store_result(con)) {
      rows=mysql_num_rows(res);
      cols=mysql_num_fields(res);
      printf("Fetched %u rows by %u fields\n",rows,cols);
      while(row=mysql_fetch_row(res) {
        for(i=0;i<cols;i++) printf("| $s |",row[i]);
        printf("\n");
        }
      mysql_free_result(res);
      }
    else printf("Returns a zero set\n");
    }
  else print_error(con);
  mysql_close(con);
  return 0;
  }
Подробное описание ф-ий есть на английском в мануале на их сайте и на русском на http://www.mysql.ru/docs/ (несколько устаревший мануал, но вполне годный).
« Последнее редактирование: 22-11-2007 15:55 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #8 : 28-11-2003 13:04 » 

скачал я mysql++, вроде все просто и красиво там у них, при компиляции выдает 13 варнингов вида:
c:\program files\microsoft visual studio\vc98\mysql\include\type_info1.hh(172) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
незнаю как лечить Жаль
Цитата
#include <mysql/mysql.h>

такой хедер есть в mysql++, но в таком виде ошибки пишет нехарошие
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 28-11-2003 13:42 » 

Ну, что писать в include, зависит от того, где у тебя заголовки и какие пути для поиска переданы компилятору. К тому же я писал о С, а не о С++. Для С++ смотри в том же мануале.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #10 : 02-12-2003 11:45 » 

Хех, заголовочные файлы, либы и дллки нашлись в дистрибе MySQL, чета я их сразу незаметил  Я шокирован! Там действительно чистый С и все предельно ясно, вот только я нелюбитель садо-мазы, поэтому всетаки расковырял ODBC. Есть 2 преимущества:
1. Не надо кодить в чистом С или даже С++, в MFC есть готовые классы для работы.
2. Появилась идея приложения работающего по желанию юзера как клиент-сервер, либо файл-сервер. Для осуществления не надо переделывать ни байта кода, просто изменить настройки ODBC.
MySQL действительно не работает с dynaset'ами, причем и Interbase тоже, как я понял это только фича мелкомяхтовских продуктов Access, MS SQL Server. Сделал доступ через snapshot'ы, все оказалось просто. Есть правда один минус, все данные хранятся в памяти (не проверял, где-то прочитал).
ЗЫ. Искренне завидую 2м нашим делфистам, которым достаточно просто подключить компонент, а на сам механизм глубоко наплевать.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 02-12-2003 12:41 » 

Был опыт использования MySQL через ODBC в VisualFoxPro (программировал не я - я советы давал и сервером управлял). Негативный момент: при длительном (практически постоянном) соединении, если соединение с сервером прерывается (в моих испытаниях - посредством таймаута на сервере), то соединение не востонавливается автоматом. В С-API это возможно через mysql_ping().

Что касается места хранения результирующего набора, то есть два метода: скачивается полностью к клиенту, или находится на сервере и скачивается по мере необходимости (построчно или больше - не знаю). Метод можно выбрать в настройках DSN.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mr. MO
Гость
« Ответ #12 : 09-12-2003 20:30 » 

Имея небольшой опыт прогшраммирования MySQL хотелось бы порекомендовать использовать API MySQL, а не ODBC. Он действительно несложный, и позволяет гибче работать с базой, чем громоздкий ODBC.
Кстати читал я где- то, как чуваки сами проводили независимые тесты и выяснилось, что производительность при использовании ODBC драйвера падает процентов на 30 - 35.
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #13 : 10-12-2003 00:43 » 

Лучше всего из VC подойтет MySQL++ (классы для работы  с базой) или же MySQL API (просто функции). Ведь сам MySQL написан на С.
Записан
Kuzmich
Гость
« Ответ #14 : 10-12-2003 04:18 » 

Цитата: Mfcer__
Лучше всего из VC подойтет MySQL++ (классы для работы  с базой) или же MySQL API (просто функции).
у меня этот mysql++ выдает 13 варнингов при компиляции Жаль
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #15 : 10-12-2003 08:52 » 

Цитата

у меня этот mysql++ выдает 13 варнингов при компиляции

но ведь программа то работает  Отлично
Записан
Kuzmich
Гость
« Ответ #16 : 10-12-2003 11:13 » 

Цитата

но ведь программа то работает

работает, но у меня все-таки в последнее время пропала склонность к мазахизму, классы MFC использовать куда удобнее 8)
Записан
Mr. MO
Гость
« Ответ #17 : 10-12-2003 14:15 » 

Цитата

у меня этот mysql++ выдает 13 варнингов при компиляции

А что за варнинги???
Записан
Kuzmich
Гость
« Ответ #18 : 11-12-2003 04:02 » 

c:\program files\microsoft visual studio\vc98\mysql++\include\type_info1.hh(159) : warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning)
все в таком духе с номером C4800
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 11-12-2003 08:42 » 

Пустяковая ошибка. Самый простой способ борьбы - отключить часть предупреждений.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #20 : 11-12-2003 12:55 » new

Я пробовал ставить warning level: none, не помогло, м.б. где-то в другом месте отключить ?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines