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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Firebird+ODBC  (Прочитано 150323 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 11-07-2008 04:03 » 

и ещё странный проблем:

имеется комп C1 с айпишниеом IP1, комп С2 с IP==IP2

к примеру, на компе С1 программа подключается к базе, находящейся на компе С2, в строке подключения

DBNAME=\\IP2\c:\rrrr\tttt\base.fdb

подключение происходит, но на C2 птица выкидывает окно "Missing configuration file: c:\....\aliases.conf". Причём, такой файл там лежит.
Программа на С1 не может работать с базой, пока не закрыть окошко на C2. Далее всё идёт нормально.

Самое интересное: делаем всё то же самое, но локально: на C1 задаём путь

DBNAME=\\IP1\c:\rrrr\tttt\base.fdb

окно не появляется, подключение нормальное.

Что такое и как побороть это окошко?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 11-07-2008 04:38 » 

ага, с окошком разобрался, похоже это глюказоид птицы:

если задать путь в виде
DBNAME=IP2:c:\rrrr\tttt\base.fdb

или
DBNAME=comp_name:c:\rrrr\tttt\base.fdb

то проблема отпадает
Записан

Oldy
Команда клуба

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

« Ответ #32 : 14-07-2008 18:09 » 

Это не глюк а "фича". Запрет работы в сети локальным коннектом. А базы лучше хранить на не "расшаренных" ресурсах, иначе их очень скоро начнут продавать где нибудь на колхозном рынке.  Ага
Записан

С уважением, Oldy.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 14-07-2008 19:36 » 

Oldy, ))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 27-11-2008 07:26 » 

ещё одна глюка-фича ? )

имеется в таблице поле "Picture" с блобом. Если извлекаю все записи с непустым блобом
select ID, picture from T where picture is not null
а потом шагаю по рекордсету (CRecordset) , то все блобы - одинаковые, такие как самый первый!

если же для каждого ID сделать
select ID from T where picture is not null
затем перебираем ID
for(...;...;...)
{
   
   select picture from T where ID=%d //заранее вытащеное значение ID

   читаем блоб
}
 - так всё нормально, все блобы какие нужно вытаскиваются.

То есть получается , за один раз рекордсет работает только с самым первым блобом, все последующие - игнорируются и заменяются в выборке первым ?
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #35 : 27-11-2008 08:29 » 

Алексей1153++, быстрее проблема с использованием API - я так думаю...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #36 : 27-11-2008 08:37 » 

то есть глюк - в классе CRecordset ?
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #37 : 27-11-2008 08:59 » 

Я думаю, что глюк в способе "утилизации" BLOB из рекордсета в программе.
В общем, чтобы не гадать, приведи пример кода.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 27-11-2008 09:31 » 

пример кода не поможет, там способ один единственный ) Я дома запостю, вырезать надо
Записан

Oldy
Команда клуба

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

« Ответ #39 : 28-11-2008 12:30 » 

фетч и размер буфера
Записан

С уважением, Oldy.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 28-11-2008 12:42 » new

Цитата
Я дома запостю, вырезать надо
ой, блин, я как всегда всё забыл выложить....

Oldy, а что за фетч ? )  Размером буфера не я управляю, класс CRecordset сам вроде это делает
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #41 : 28-11-2008 12:55 » 

вот код, где буфер повторяется

Код:
try
{
CString sql;
CDBVariant var;

sql="SELECT PICTURE,ID FROM T where PICTURE is not NULL ";

CRecordset rs1(pbase);//pbase - указатель на уже открытый CDatabase
rs1.Open(CRecordset::snapshot,sql,CRecordset::readOnly);

enum
{
f_pict,
f_id,
};

WORD wID=0;
for(;!rs1.IsEOF();rs1.MoveNext())
{
CDBVariant var1;

rs1.GetFieldValue(f_id,var1);
if(var1.m_dwType==DBVT_NULL)continue;
wID=(WORD)var1.m_lVal;

//рисунок
rs1.GetFieldValue(f_pict,var1);
if(var1.m_dwType!=DBVT_BINARY)continue;
if(!var1.m_pbinary)continue;


BYTE* bufer=0;
DWORD dwdDataLen=0;

//достаём длину
dwdDataLen=var1.m_pbinary->m_dwDataLength;
if(!dwdDataLen)continue;

//читаем блоб длиной dwdDataLen (блокируем память с HGLOBAL)
bufer =(BYTE*) GlobalLock(var1.m_pbinary->m_hData);
{
if(!bufer)continue;

//теперь буфер bufer содержит dwdDataLen байт блоба

//... что нибудь делаю с буфером
//
// НО БУФЕР ПОСТОЯННО ОДНО И ТО ЖЕ СОДЕРЖИТ

}
//разблокируем память, если была за
if(bufer)GlobalUnlock(var1.m_pbinary->m_hData);

var1.Clear();
bufer=0;
dwdDataLen=0;

}

}
catch(...)
{
}
« Последнее редактирование: 28-11-2008 12:57 от Алексей1153++ » Записан

Oldy
Команда клуба

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

« Ответ #42 : 28-11-2008 17:17 » 

Из Developer’s Guide для IterBase

Цитата
Fetching records
By default, when you enable cached updates, datasets automatically handle fetching of
data from the database when necessary. Datasets fetch enough records for display. During
the course of processing, many such record fetches may occur. If your application has
specific needs, it can fetch all records at one time. You can fetch all records by calling the
dataset’s FetchAll method. FetchAll creates an in-memory, local copy of all records from
the dataset. If a dataset contains many records or records with large Blob fields, you may
not want to use FetchAll.
Client datasets use the PacketRecords property to indicate the number of records that
should be fetched at any time. If you set the FetchOnDemand property to True, the client
dataset automatically handles fetching of data when necessary. Otherwise, you can use
the GetNextPacket method to fetch records from the data server. For more information
about fetching records using a client dataset, see “Requesting data from an application
server” in the “Creating and using a client dataset” chapter of the Delphi 5 Developer’s
Guide.

Цитата
Using cached updates
This section provides a basic overview of how cached updates work in an application. If
you have not used cached updates before, this process description serves as a guideline
for implementing cached updates in your applications.
To use cached updates, the following order of processes must occur in an application:
1. Enable cached updates. Enabling cached updates causes a read-only
transaction that fetches as much data from the server as is necessary for
display purposes and then terminates. Local copies of the data are stored in
memory for display and editing. For more information about enabling and
disabling cached updates, see “Enabling and disabling cached updates” on
page 231.
2. Display and edit the local copies of records, permit insertion of new records,
and support deletions of existing records. Both the original copy of each
record and any edits to it are stored in memory. For more information about
displaying and editing when cached updates are enabled, see “Applying
cached updates” on page 233.

хотя это все из области предположений.  А черт его знает...
Записан

С уважением, Oldy.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #43 : 28-11-2008 17:37 » 

ну так что исправить то в это коде, я так и не понял Улыбаюсь Пока оставил с вложенным в цикл ещё одним Select  -
for( ; ; )
{
select picture from T where ID=%d //заранее вытащеное значение ID , где блоб не NULL
}
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #44 : 04-12-2008 12:15 » 

Зачем программные проверки, если можно не выбирать лишнего?

sql="SELECT PICTURE,ID FROM T where PICTURE is not NULL AND ID IS NOT NULL";

Честно говоря, ID NULL - это какая-от форма извращения.

Не знаком я с типом CDBVariant и его особенностями, но чую, что проблемы вероятно в нем и GlobalLock/GlobalUnlock.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 04-12-2008 12:32 » 

RXL,

 можно и не выбрать. Но смысл есть: это поле на самом деле - не ID , его я недавно добавил, поэтому мне нужно знать, где оно уже было заполнено, а где нет Улыбаюсь

GlobalLock/GlobalUnlock -  какая тут проблема может быть ? Утечек не обнаружено
Записан

Oldy
Команда клуба

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

« Ответ #46 : 04-12-2008 18:13 » 

Лёш, елки-палки, ну сколько у тебя записей с картинками? Вероятнее всего много. А места для хранения промежуточных результатов запроса со всеми картинками вероятно не много. Вот и фетчится, возвращает результат запроса, только одной записи, первой c картинкой. Поэтому, или смени логику работы, т.е. или выбирай по одной записи, или отыщи у применяемых тобою компонентов параметры  позволяющие определить объем возвращаемой информации, т.е. установить FetchAll.
Записан

С уважением, Oldy.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 05-12-2008 05:04 » 

Oldy, я уже по одной записи и сделал ) Разбираться больше не стал, так так потом всё равно на MySQL переходить
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 21-01-2009 08:50 » 

SELECT T.A+T.B as D from T  where D=4

почему происходит ругань на "where D=4" (вернее, понятно, почему, а как сделать то проверку ? )
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #49 : 21-01-2009 09:30 » 

Леш, WHERE относится к этапу выборки - как можно знать значение заранее? Постусловие можно задать в HAVING:

Код: (SQL)
SELECT a + b AS d
FROM t
GROUP BY d -- иначе может ругаться на HAVING
HAVING d  = 4
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 21-01-2009 09:37 » 

хм, ругается
SELECT a + b AS d
FROM t
GROUP BY d

d - Column unknown.


ага, вот так группирует
SELECT a+b d from t group by 1

но отфильтровать по прежнему никак не вышло )))
« Последнее редактирование: 21-01-2009 11:03 от Алексей1153++ » Записан

RXL
Технический
Администратор

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

WWW
« Ответ #51 : 21-01-2009 09:58 » 

Код: (SQL)
SELECT a + b AS d
FROM t
GROUP BY a + b
HAVING a + b = 4
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #52 : 21-01-2009 11:04 » 

а если формула длинная и неудобная Улыбаюсь
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #53 : 21-01-2009 11:12 » 

Алексей1153++, компьютеру до лампочки. Для удобства можешь создать детерминированную функцию.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #54 : 21-01-2009 11:18 » 

ну это всё как бы ладно, самое интересное - тип алиаса стал DBVT_STRING , это так всегда или можно тип результата задать ?
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #55 : 21-01-2009 13:35 » 

Группировки тут вообще не в тему, а вторичный фильтр HAVING предназначен именно для группировок. Полагаться на то, что вычислимые поля будут ему доступны, я бы не стал.

Либо:
Код:
SELECT T.A+T.B AS D FROM T WHERE T.A+T.B=4

Либо, если важно формулу иметь в одном месте кода:
Код:
SELECT T1.D FROM (SELECT T.A+T.B AS D FROM T) WHERE T1.D=4
Надеюсь, "птичка" поддерживает вложенные запросы.

В последнем случае следует учитывать, что сперва будет получен результат первого запроса, и только потом применён фильтр - на больших объёмах данных может быть не очень хорошо.

Либо user-defined функцию создать (опять же, если "птичка" позволяет).
Код:
SELECT MyFunc(T.A, T.B) AS D FROM T WHERE MyFunc(T.A, T.B)=4
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #56 : 21-01-2009 13:36 » 

dimka, точно...
Спать надо по ночам! Жаль
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #57 : 21-01-2009 14:31 » 

dimka, вложенный селект сразу отпадает, он тут по какой то причине не поддерживается

функцию можно. Так и сделаю наверное
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #58 : 21-01-2009 21:17 » 

Алексей1153++, у меня там синтаксическая ошибка - пропустил псевдоним (alias) для результата вложенного запроса:
Код:
SELECT T1.D FROM (SELECT T.A+T.B AS D FROM T) T1 WHERE T1.D=4

Надеюсь, ты это учёл, когда говорил, что вложенные запросы не поддерживаются Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #59 : 22-01-2009 04:38 » 

dimka, нет, это я говорю, потому что это уже не раз проверено )
Записан

Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines