Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / классы доступа к firebird / 25 сообщений из 29, страница 1 из 2
24.01.2004, 15:17
    #32386906
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
Решил я написать классы доступа к серверу sql firebird(ну и остальные из этой кучи)

Вообще я их уже начал, но решил сделать их доступными типа в исходниках :-)
Основная мысль, чтобы их функциональность была подобна дельфевым объектам. чтобы лгче было переползать, так сказать.
при этом исходники должны быть межплатформенными. чтоб легко можно было собрать проект под любую платформу. ну, если графики нету. хотя графику можно использовать какуюнибудь типа wxWindows.

Что я реализовал.

TDATABASE
TTRANSACTION
TQUERY

и то, не до конца. хотелось бы услышать мнение людей, какие еще объекты нужно бы добавить, какие методы и свойства у этих объектов должны быть.

я думаю, теперь нужно сделать TFIELD.
От него отнаследовать несколько классов, типа TFIELDVARCHAR, TFIELDFLOAT, TFIELDINTEGER и т.д.

или сделать как в дельфи, функции asString, asFloat, asInteger и т.д.?

для чего это нужно мне? для обучения, раз. для самоутверждения два. ну и последнее, буду мелкие прикладухи не на дельфи писать, а на си.

в общем, мысли и предложения. прошу.
...
Рейтинг: 0 / 0
25.01.2004, 03:01
    #32387084
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
а разве нет OLEDB-провайдера для FB?
...
Рейтинг: 0 / 0
25.01.2004, 09:08
    #32387098
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
есть наверное.
а как пользоваться этим провайдером на FreeBSD компилируя при помощи gcc?

я хочу простые, узконаправленные классы, которые не будут работать с тысячей серверов и поддерживать универсальную функциональность. пусть они будут настолько простыми как только можно, но не прощще(с).
kiss рулит
...
Рейтинг: 0 / 0
25.01.2004, 13:11
    #32387169
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
Если вы остановитесь на qt вместо wxwindows то обнаружите что там уже есть data-bounded таблицы/поля и т.д. и обобщенный доступ до баз данных. Через ODBC.

Для FB насколько я помню есть odbc драйвера easysoft-овские и какие-то родные с ibphoenix.
В юниксах через unixodbc, в windows через родной odbc.
...
Рейтинг: 0 / 0
26.01.2004, 03:02
    #32387280
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
я на qt не остановлюсь.
не нравится мне то, что это все-в-одном библиотека.
хочется отдельно иметь классы доступа к firebird и все. только и всего. и не качать хрен знает сколько исходников, которые только компилятся по несколько минут. и не устанавливать по двадцать библиотек плюс свежжайшие утилиты типа gmake а иначе ничего не скомплитися.

просто. просто 5-10 классов, не больше в двух трех хидерах.
...
Рейтинг: 0 / 0
26.01.2004, 09:10
    #32387345
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
Понятно. Тогда я удивлен вашим выбором - wxwindows. Не самая маленькая бибка..
...
Рейтинг: 0 / 0
26.01.2004, 10:21
    #32387394
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
вообще я не выбиал wxWindows.
просто, "а вдруг". а вдруг понадобится сделать графическую тулзу под иксы. хотя пока такой работы не предвидится, но "а вдруг".

а вот консольные проги под фришку мне уже очень надо. пишу на яве. а ява, на нашем 166 пне что являет собой шлюз хавает много процентов процессорного времени.
мне это не шибко нравится. да и ставить ее, если что, много места надо.
а у меня сервачек один есть, так там места совсе мало, даже логи не хранятся...
...
Рейтинг: 0 / 0
26.01.2004, 18:49
    #32388286
Nimble
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
2 Alex_K

Честно говоря я сам думал над похожей проблеммкой. Если не сложно, вышли исходники или хотябы какую-то часть, в образовательных целях. Nimble@pisem.net
Извени за тупой вопрос, но TDATASET тоже нужен, или ты считаешь, что Query можно обойтись?
...
Рейтинг: 0 / 0
26.01.2004, 19:19
    #32388325
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
пока они не примемлемо заработают ничего высылать или выкладывать не буду.
ну чего позорится?

насчет DATASET не вижу пока смысла.
в дельфи этот объект используется для связки с визуальными контролами редактирования и просмотра.
в своих проектах(на делфи) стараюсь использовать его по минимуму, в общем пока реализовывать не имею в планах.

остается открытым другой вопрос, стоит ли делать несколько разных классов для доступа к данным разных типов или нужно сделать всю функциональность в одном классе.

еще.
я сделал упрощенно 4 типа данных:
FBTYPE_INTEGER (все целочисленные данные)
FBTYPE_VARCHAR (все строковые данные)
FBTYPE_FLOAT (все числа с плавающей запятой)
FBTYPE_DATETIME (дата и время)

над блобом думаю.
остальные типы остались за гранью моего разума :-)
что думаете?
...
Рейтинг: 0 / 0
27.01.2004, 00:51
    #32388465
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
alex_k
я чето похожее уже сделал для sybase и пытался перенести на firebird(без одибиси).
на fb мне не понравилось, что нет возможности произвольного доступа к любой записи в запросе, и я бросил эту работу (без одибиси).
только оно вообще не похоже ни на что. -)))
особенно на дельфи.

alex_k>хочется отдельно иметь классы доступа к firebird и все. только и всего

вот приблизительно это. безотносительно ко всяческим окнам.
если тебе не лень
(
я тоже начал с нескольких простых классов, а работы получилось неожиданно много. года два ваял
),

то могу дать примеры использования, исходники и
попробовать пообьяснять.
...
Рейтинг: 0 / 0
27.01.2004, 06:28
    #32388492
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
2tchingiz
спасибо, но у меня пока вроде все ясно :-)
давай так, зайду в тупик, обращусь. ок?
...
Рейтинг: 0 / 0
27.01.2004, 08:39
    #32388533
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
гут
>я думаю, теперь нужно сделать TFIELD.

ты собираешься доступаться по полям?

то бишь в программе, которая будет читать запись таблицы,
каждый обьект описывать руками через твои классы
FBTYPE_INTEGER (все целочисленные данные)
FBTYPE_VARCHAR (все строковые данные)
FBTYPE_FLOAT (все числа с плавающей запятой)
FBTYPE_DATETIME (дата и время)
...
Рейтинг: 0 / 0
27.01.2004, 08:41
    #32388535
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
alex_k>какие методы и свойства у этих объектов должны быть.

а обьекты для полей там тоже есть
;))
...
Рейтинг: 0 / 0
27.01.2004, 08:48
    #32388538
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
ну примерно.
все таки я решил сделать чуть-чуть иначе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void somefunc(TFBTRANSACTION *trn)
{
  TFBQUERY *q=new TFBQUERY(trn);
  q->sql= "select first 1  * from sometable";
  int someInt=q->fieldByName( "someintfield" )->asInteger();
  string someStr=q->fieldByName( "somestrfield" )-.asString();
  delete q;
}

вот так.
почти работает :-)
...
Рейтинг: 0 / 0
27.01.2004, 08:49
    #32388539
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
забыл опен сделать :-)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void somefunc(TFBTRANSACTION *trn)
{
  TFBQUERY *q=new TFBQUERY(trn);
  q->sql= "select * from sometable" ;
  q->open();
  int someInt=q->fieldByName( "someintfield" )->asInteger();
  string someStr=q->fieldByName( "somestrfield" )-.asString();
  delete q;
}
...
Рейтинг: 0 / 0
27.01.2004, 09:00
    #32388543
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
ты с одибиси работаешь?
так ты там структуру таблицы разбираешь? в запросе?
а движение по строчкам в запросе как?
и компилятор не найдет не правильно названные поля "somestrfield"
q->fieldByName("somestrfield")-.asString();
...
Рейтинг: 0 / 0
27.01.2004, 09:10
    #32388555
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
нет не с odbc.
через gds32.dll
движение по строчка при помощи
next();
prev();
first();
last();
moveBy(int);



и компилятор не найдет не правильно названные поля "somestrfield"
q->fieldByName("somestrfield")-.asString();


а вот этого я вообще не понял...
ты имеешь в виду мою опечатку насчет ->?
...
Рейтинг: 0 / 0
27.01.2004, 10:58
    #32388721
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
опечатка это фигня, каждому поеятно что не переключился на английский ... я так понимаю что tchingiz имел а виду вот такой случай

скажем есть вот такой запрос:
Код: plaintext
1.
SELECT SomeField_1,SomeField_2
FROM SomeTable


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void somefunc(TFBTRANSACTION *trn)
{
  TFBQUERY *q=new TFBQUERY(trn);
  q->sql= "SELECT SomeField_1,SomeField_2 FROM SomeTable" ;
  int someInt=q->fieldByName( "someintfield" )->asInteger();
  string someStr=q->fieldByName( "SomeField_10" )->asString();
  delete q;
}


(блин так и не удалось жирным выделить "SomeField_10". как по мне это не правельная логика работы сайта ... хотя у создателей наверно были на то причины)

так вот в полученном запросе поля SomeField_10 не будет, а следовательно
Код: plaintext
string someStr=q->fieldByName( "SomeField_10" )->asString();
является ошибкой, но это задача не компилятора,а твоего класса ...
...
Рейтинг: 0 / 0
27.01.2004, 14:43
    #32389160
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
мне кажется это ошибка не компилятора, не класса, а пользователя(программиста).
зачем он обращается к несуществующему полю?
функция fieldByName(string) вернет NULL и обращение к NULL как к TFBFIELD выдаст исключение, которое можно ловить.
в принципе, эту ситуацию можно ловить в самой функции fieldByName(string)
и возвращать указатель на экзэмпляр класса TFBFIELD с пустым содержимым или содержимым по умолчанию.
...
Рейтинг: 0 / 0
27.01.2004, 14:45
    #32389165
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
мне кажется это ошибка не компилятора, не класса, а пользователя(программиста).
зачем он обращается к несуществующему полю?
функция fieldByName(string) вернет NULL и обращение к NULL как к TFBFIELD выдаст исключение, которое можно ловить.
в принципе, эту ситуацию можно ловить в самой функции fieldByName(string)
и возвращать указатель на экзэмпляр класса TFBFIELD с пустым содержимым или содержимым по умолчанию.
...
Рейтинг: 0 / 0
27.01.2004, 14:46
    #32389166
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
вот глупый эксполорер :-)
...
Рейтинг: 0 / 0
27.01.2004, 23:12
    #32389878
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
0
да 123456789098

1
не ну конечно ошибка программиста.
как и все остальные ошибки.
-)))))))))

2
неплохо бы переопределить конвертацию полей в соответствующей тип

int i;
FBTYPE_INTEGER ifb;

ifb = 1;

i = ifb;

для ваших примеров, чтото типа такого:

string someStr=q->fieldByName("SomeField_10");



3
и для экспорта - импорта какое-то преобразование записей в строчку и обратно.

4
alex_k
---
gds32.dll

prev();
first();
last();
----
у меня в fb есть долько gds32.lib.
а в руководстве по апи я не нашел передвижение в запросе в обратном порядке.
меня убеждали. что fb, может только сверху вниз позиционировать записи.

это не правда?


5
собственно к таблице обращаешься через sqlda
или в этом gds32.dll есть чтото другое?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
           sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH( 1 ));
           if (sqlda) {
               sqlda->sqln =  1 ;
               sqlda->sqld =  1 ;
               sqlda->version =  1 ;
               sqlda->sqlvar[ 0 ].sqldata = (char ISC_FAR *)&lint;
               sqlda->sqlvar[ 0 ].sqltype = SQL_LONG +  1 ;
               sqlda->sqlvar[ 0 ].sqlind  = &li;
               sqlda->sqlvar[ 0 ].sqllen  = sizeof(lint);
               rc = isc_dsql_allocate_statement(status, &DB, &stmt);



6
я по описанию таблицы генерировал структуру, которая использовалась для
доступа к таблице.
и в программе к полю обращался как

q->SomeField_10

мои ошибки, связанные с неправильным указанием полей, радостно находил компилятор и меня уведомлял.
естественно код, для обработки этих исключений
(
alex_k>TFBFIELD выдаст исключение, которое можно ловить
)
писать было не надо.
в это время я пил пиво.
/*
хотя это вечная тема, кто лучше компилятор или интрепретатор
-)))))))))))))))))))))))
*/
...
Рейтинг: 0 / 0
27.01.2004, 23:48
    #32389884
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
неплохо бы переопределить конвертацию полей в соответствующей тип
это да, дело стоящее...

у меня в fb есть долько gds32.lib.
а в руководстве по апи я не нашел передвижение в запросе в обратном порядке.
меня убеждали. что fb, может только сверху вниз позиционировать записи.

это не правда?


это правда. нужно эмулировать. пока думаю при необходимости фетчить. тоесть если ntxt();next();next(); то fetch();fetch();fetch()
а вот если сразу last(); то тогда придется fetchall(); и держать в памяти.


я по описанию таблицы генерировал структуру, которая использовалась для
доступа к таблице.

какая нечеловеческая логика :-)
нет, я думаю а вдруг селккт в рантаме определять захочется?
...
Рейтинг: 0 / 0
28.01.2004, 02:30
    #32389916
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
это я както понимаю про next()
ты лучше колись,
как ты делаешь prev(); prev(); prev()?


>нет, я думаю а вдруг селккт в рантаме определять захочется?

во- первых, эта возможность есть.
для наперед известных таблиц в сгенерированной структуре. а для наперед неизвестных таблиц, я, действительно, буду доступаться по имени поля в кавычках или по порядковому номеру.
;-P

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

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

че про sqlda молчишь?
...
Рейтинг: 0 / 0
28.01.2004, 02:53
    #32389918
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
классы доступа к firebird
ты лучше колись,
как ты делаешь prev(); prev(); prev()?

че про sqlda молчишь?

да я еще документацию читаю.
у меня только запросы выполняются, а что делать с результатом запроса я пока не знаю :-)

времени не очень много.
щас вот пару часов назад дописал конторский прокси(и то, подглючивает).
потом пописал левый проект пару часиков.
а щас уже спать хочется, да рабочий день скоро, буду отчеты делать для отдела продаж.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / классы доступа к firebird / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]