Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из базы и strstr() 
:(
    Опции темы
Maledictus
Дата 16.12.2008, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: нет
Всего: 1



Мое почтение.
Сабж:Добавляю запись в базу.Тут же хочу найти ее.Поиск по нескольким пеараметрам.Заполняю только  один из них..При исрользовании strstr() NULL-овая строка существует в любой строке поэтому все зависит от заполненного параметра.Но почему то при проверке strstr для остальных параметры выдают NULL. И тем самым поиск не проходит.Но стоит открыть и закрыть приложение, как поиск тут же начинает работать с этой записью нормально.Куда копать?
Благодарю.
PM MAIL ICQ Jabber   Вверх
dizzy1984
Дата 16.12.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Если ты пишешь на mfc, то на первый взгляд дело в типе рекордсета. CRecordset::Open первым параметром позволяет выбрать тип, среди прочих свойств которого можно найти способ обновления данных - либо после операции выборки, либо после закрытия/открытия рекордсета. Если выбрано последнее, то понятно что происходит в твоем случае - после добавления рекордсет не обновляется и ищет среди записей, существовавших до добавления. После открытия происходит повторное открытие рекордсета и он получает добавленные данные.
PM MAIL   Вверх
Maledictus
Дата 17.12.2008, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: нет
Всего: 1



По моему это не так.Дело в том что когда запись только добавил и сразу же начинаю искать, то в этом коде:
Код

   while(!DataModule2->IBQuery1->Eof){
   if((strstr(DataModule2->IBQuery1->FieldByName("name")->AsString.c_str(),str3.c_str()) != NULL ) &&
      (strstr(DataModule2->IBQuery1->FieldByName("comment")->AsString.c_str(),str4.c_str()) != NULL) &&
      (strstr(DataModule2->IBQuery1->FieldByName("condition")->AsString.c_str(),str1.c_str()) != NULL) &&
      (strstr(DataModule2->IBQuery1->FieldByName("work_plan")->AsString.c_str(),str2.c_str()) != NULL)
     )

,где str1,srt2,str4 = NULL,a str3 != NULL.
почему то как и положено:
Код

strstr(DataModule2->IBQuery1->FieldByName("name")->AsString.c_str(),str3.c_str()) != NULL 

,но 
Код

strstr(DataModule2->IBQuery1->FieldByName("comment")->AsString.c_str(),str4.c_str()) == NULL
strstr(DataModule2->IBQuery1->FieldByName("condition")->AsString.c_str(),str1.c_str()) == NULL  strstr(DataModule2->IBQuery1->FieldByName("work_plan")->AsString.c_str(),str2.c_str()) == NULL

, что не должно быть.
А после перезапуска все становится отлично
Код

strstr(DataModule2->IBQuery1->FieldByName("name")->AsString.c_str(),str3.c_str()) != NULL
strstr(DataModule2->IBQuery1->FieldByName("comment")->AsString.c_str(),str4.c_str()) != NULL
strstr(DataModule2->IBQuery1->FieldByName("condition")->AsString.c_str(),str1.c_str()) != NULL
strstr(DataModule2->IBQuery1->FieldByName("work_plan")->AsString.c_str(),str2.c_str()) != NULL


PS:пишу в C++Builder 6.0

Это сообщение отредактировал(а) Maledictus - 17.12.2008, 07:25
PM MAIL ICQ Jabber   Вверх
dizzy1984
Дата 17.12.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Вообще-то, strstr не должна работать в случае когда один из параметров равен 0 (Сейчас попробовал пример на vs2003 и он окончился access violation). Откуда информация о 
Цитата

При исрользовании strstr() NULL-овая строка существует в любой строке

Попробуй добавить в условие проверку на наличие строки. Что-то вроде
Код

(str3.length() == 0 || strstr(DataModule2->IBQuery1->FieldByName("name")->AsString.c_str(),str3.c_str()) != NULL ) &&
(str4.length() == 0 || strstr(DataModule2->IBQuery1->FieldByName("comment")->AsString.c_str(),str4.c_str()) != NULL) &&
(str1.length() == 0 || strstr(DataModule2->IBQuery1->FieldByName("condition")->AsString.c_str(),str1.c_str()) != NULL) &&
(str2.length() == 0 || strstr(DataModule2->IBQuery1->FieldByName("work_plan")->AsString.c_str(),str2.c_str()) != NULL)

PM MAIL   Вверх
Maledictus
Дата 18.12.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: нет
Всего: 1



Спасибо-помогло.Но на C++ Builder 6 получается что NULL-овая строка существует в любой строке.=)))
PM MAIL ICQ Jabber   Вверх
dizzy1984
Дата 19.12.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Если что-то явно не описано в документации производителя библиотеки - результат выполнения есть следствие неопределенного поведения кода, которое в частном случае может быть желаемым, но полагаться на него все равно нельзя.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.