Автор Тема: Вспомним старый добрый DBF. Разъясните?!  (Прочитано 1852 раз)

0 Пользователей и 1 Гость просматривают эту тему.

spawn

  • Гость
#0: 17 Ноября 2003, 12:51:53
Hello Всем! Есть тут кто любит программки пописать? Ну ладно, вопрос такой: Поключаюсь с помощью WinApi к базе (dBase) через ODBC. Вроде все хорошо. Вставляю записи, создаю таблицы, удаляю таблицы все нормально. Как только пытаюсь сделать в базе UPDATE или DELETE, то ODBC на меня обижается и говорит: Должен использоваться обновляемый запрос (при UPDATE) и Невозможно удаление записей из этих таблииц (при DELETE). Разъяснит кто данную ситуацию или так и буду дальше головой биться об стену?

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#1: 18 Ноября 2003, 09:30:35
Из какой среды ты коннектишься к таблице. Акцесс? Делфи?
Само приложение на чем написано?

Вован

  • ***
  • Сообщений: 8032
    • Просмотр профиля
#2: 18 Ноября 2003, 09:31:30
Вот видишь, 35 просмотров - и не одного совета.
Бросай ты эту DBF! Старо и не канает.:))

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#3: 18 Ноября 2003, 09:58:12
А вот еще интресный вопрос к spawn:

Ты говоришь о БАЗЕ (dbf). Но в dBase понятие базы - это одна таблица. А вообще-то, академическое понятие \"база\" позразумевает целый набор таблиц (со всякими там отношениями между ними).

Так что, из твоего вопроса пока неясно с чем же ты работаешь и что подразумеваешь под словом БАЗА?

Вован: Зря ты так категорично! Множество мелких настольных приложений до сих пор успешно используют DBF. Мелкие задачки типа всяких там записных книжек, телефонных справочников, каталогов аудио-видео записей..... Нафига ради трёх колосков целый комбайн заводить????

Maestro

  • Гость
#4: 18 Ноября 2003, 13:48:11
2:spawn
Бывает еще и ODBC \"кривой\". Если он шароварный или фриварный - попробуй другой...
Но а вообще НАХ прав. Че у тебя на клиенте? Обновляемый запрос и необновляемый - это нормально...Это разные запросы...С этим у тебя как?

spawn

  • Гость
#5: 18 Ноября 2003, 16:55:46
Чуваки если я подключаюсь через ODBC значит так надо. Если кому интересно, то подключаюсь посредством Visual C++, с использованием ODBC API. Да еще, Нахухоль объясни, какая разница в том, что база состоит из одной таблицы или из нескольких, это все равно база. Просто таблица пока только одна! Дело в стадии разработки и отладки! Борсать эту затею не получится, т.к. условия ставлю не я. Я их только могу довести до ума или не довести! Короче если не интересно то и писать сюда нне стоит! Да насчет ODBC, где б его нормальный еще взять вроде с MS SQLSERVER 2000 пашет без проблем. Может у кого дрова для dBase IV завалялись, а?

Fox

  • Гость
#6: 19 Ноября 2003, 02:35:35
You have to have update property as UPDATEBLE. As default you cursor probably opens only for READONLY. Please see manual. I do not remember exactly - FoxPro ODBC for DBF has 5 dofferent values... I think 5 - you can update cursor without any problems.

Sorry for English...

spawn

  • Гость
#7: 19 Ноября 2003, 09:10:16
Fox, was pleasant to me your sentence: You have to have! It`s cool! Serious, I must to use ODBC dBase driver ver IV. And can you more detailed describe situation:
update property as UPDATEBLE. As default you cursor probably opens only for READONLY.
It`s interesting!

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#8: 19 Ноября 2003, 09:45:11
To Fox:
-------------------------------------------------
As default you cursor probably opens only for READONLY
-------------------------------------------------
Да, но тогда бы он не мог вставлять строки, а он их вставляет......
Хотя... Наверное, у него получается вставить их в курсор, а при попытке вставить их непосредственно из курсора в  таблицу (при выполнении UPDATE) и возникает ошибка. Да! Я согласен с Фоксом. Spawn, копай сюда.

To spawn:
-----------------------------------------------------
Чуваки если я подключаюсь через ODBC значит так надо.
-----------------------------------------------------
Да и слава Богу! Разве кто-нить против? Мы и сами так
подключаемся.

--------------------------------------------------------
Нахухоль объясни, какая разница в том, что база состоит из одной таблицы или из нескольких, это все равно база
--------------------------------------------------------

Пжалста!
Разница между базой и таблицей в том, что база - это СОВОКУПНОСТЬ таблиц, отношений между ними и ограничений, наложенных на каждую из таблиц на этапе разработки. То есть БАЗА - это контейнер для таблиц (хоть и для единственной).
А таблица - это ТОЛЬКО прямоугольная таблица и всё.

Ранее я хотел сказать, что если у тебя БАЗА (из нескольких таблиц) и ты пытаешься работать с ней как с ТАБЛИЦЕЙ, то возникающая проблема может скрываться в отношениях между таблицами внутри базы. Или в ограничениях, заданных для каждой таблицы в базе. Но скорее - прав Фокс.

Ты работаешь с dBase-4, понятия БАЗЫ там не было. Были ТОЛЬКО таблицы, а все отношения и ограничения описывались в программе.

spawn

  • Гость
#9: 19 Ноября 2003, 10:22:15
То Нахухоль:
Насчет БД, спасибо что объяснил что такое БАЗА, а то я сам не знал! Но это сейчас не так важно, хотя я понял, что ты имеешь в виду! Да я обращаюсь к таблице через ODBC, но предварительно создаю USER DNS в самом ODBC, ну ты понимаешь, драйвер, каталог по умолчанию и т.п., потом работаю непосредственно с самой table (table будет еще не одна).
Мне вот единственно не совсем понятно че вы там с Fox насчет курсоров говорили. Я вроде на счет них не заикался? Вот в чем вся фишка!

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#10: 19 Ноября 2003, 10:56:43
--------------------------------------------------------
спасибо что объяснил что такое БАЗА, а то я сам не знал!
--------------------------------------------------------
Ну ты этааа.... не кипятись.:))
Я хотел навести порядок в понятиях, для уверенности, что мы говорим об одном и том же.

Когда ты открываешь таблицу и показываешь ее в каком-нить Гриде - это НЕ САМА ТАБЛИЦА, а ее кусок, помещенный в память (грубо - курсор). Таблица считывается НЕ ВСЯ, а кусками(страницами). Вставляя в видимый на экране кусок строки, ты не затрагиваешь САМУ таблицу, строки вставляются В КУРСОР.
То, что вставленные строки отображаются в Гриде(или просто на форме) НЕ ЗНАЧИТ, что они УЖЕ ПОПАЛИ в таблицу.
Ты вызываешь метод UPDATE и только тогда изменения внесенные в курсор записываются в саму таблицу.

Кстати, не знаю как в VС++, а в старых версиях FoxPro курсоры были только ReadOnly. Если мы отбирали строки из таблицы в курсор командой SELECT FROM ***** INTO CURSOR, то полученный набор данных можно было показывать в Гриде, обсчитывать, печатать, но нельзя изменять и удалять строки.
Если ты пользуешься SELECT посмотри, куда попадает результат этого запроса (таблица, врем.файл, память итд итп) и узнай какие ограничения в VC++ на это

spawn

  • Гость
#11: 19 Ноября 2003, 11:38:23
To Нахухоль. Слушай я тебя понял! Просто я сначала делаю UPDATE, а только потом в форму данные забрасываю на основе если DBUpdate = true.
___________________________________________________________
Если ты пользуешься SELECT посмотри, куда попадает результат этого запроса (таблица, врем.файл, память итд итп) и узнай какие ограничения в VC++ на это
__________________________________________________________
Дело в том, что в VC++ ODBC API есть функция, и я ее вызываю.
Ну сначала выполняется сам SELECT, потом я вызываю
SQLBindCol(нэндл для запроса,
              № столбца,
              тип данных,
              буфер для данных,
              размер буфера,
              указатель на буфер для дальнейш манупуляции), которая связывает буфера данных приложения с результирующим множеством, а затем вызываю
SQLFetch(нендл запроса) - скроллинг полученных данных, указывает на следующую строку данных,
и тем самым в цикле я забираю данные (структура в памяти) из параметра: буфер для данных SQLBind(см. выше), перемещаясь с помощью SQLFetch по курсору!
Самое интересное еще то, что эти операции я выполнял сотни раз для SQL Server 2000, и там это пашет на 200 .
Надеюсь ты меня понял? Если че не понял напиши!

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#12: 19 Ноября 2003, 12:51:25
-----------------------------------------------------
я выполнял сотни раз для SQL Server 2000
-----------------------------------------------------

При этом ты работал с DBF-форматом? Или с другим?

А попробуй помещать результат СЕЛЕКТа во временную таблицу на диске. Ее обрабатывай своим приложением (избавляешься от нескольких промежуточных алгоритмов). Когда пользователь закончит редактировать данные и закроет форму, синхронизируй временную таблицу(с изменениями) с основной таблицей (тут алгоритм писать придется). В оконцовке - убивай временную таблицу. Хотя геморройно.... ибо алгоритм надо писАть..... Но \"дешевле\" пока ничего в голову не лезет.

Можь Маэстро с Фоксом что-нить пока подскажут......Удачи!

Думать надо.

ЗЫ:Может в API-функциях есть что нибудь включающее/выключающее READONLY?

spawn

  • Гость
#13: 19 Ноября 2003, 14:11:08
To Нахухоль.
Спасибо и на этом, попробую, чем черт не шутит?

Fox

  • Гость
#14: 19 Ноября 2003, 19:38:38
Here it is VB example for W2K (FoxPro DATABASE - not for a table :):

*****************************
set cn=server.createobject(\"ADODB.Connection\")
cn.ConnectionTimeout = 30
cn.provider=\"MSDASQL.1\"
connstr=\"Driver={Microsoft Visual FoxPro Driver};UID=;SourceDB=C:/base.dbc;SourceType=DBC;Exclusive=No;Backgroundfetch=NO\"
cn.Open connstr,\"\",\"\"
set rs=server.createobject(\"ADODB.RecordSet\")
cmd=\"select distinct Date, number from yourtable where ID=50

rs.open cmd,cn,3, 3
rs.addnew
rs(\"ID\")=NextID
rs(\"Date\")=now()
rs.update

rs.close
set rs=nothing
cn.close
set cn=nothing

***********************************
Here it is: parameters 3 and 3 - mean how you open your file (I give example - you can change records)...

Sorry, that I have not my usual books under my hands :)))

spawn

  • Гость
#15: 20 Ноября 2003, 14:52:12
To Нахухоль
To Fox
Оказывается все было намного проще, чем ожидалось!
Просто я взял и поставил на свою машину BDE! Все дело в том(если верить тому, что я прочитал в FAQ), что ODBC драйвер dBase начиная с версии 4.0 использует BDE для полноценной работы, хотя странно, зачем и почему вдруг ODBC зависит от BDE, такого сроду не было.
ЗЫ: Проще говоря для полноценного использования SQL в dBase надо BDE. Но все равно всем спасибо, может это кому дальше пригодится в работе с уважением SPAWN!

Fox

  • Гость
#16: 20 Ноября 2003, 19:15:17
To: spawn

Good luck!

Нахухоль

  • ***
  • Сообщений: 1720
    • Просмотр профиля
#17: 21 Ноября 2003, 08:18:15
Кто бы мог подумать......

Хотя думать надо было так. Чей продукт VC? Borland(бывает еще и Мелкософтовский из состава VisualStudio). Что использует Борланд для доступа к данным? БДЕ. Вот и все.

Впервые сталкиваюсь с тем, что БДЕ и ОДБС как-то там критично связаны. Spawn, может после установки БДЕ вообще не нужет ОДБС? Проверь ради интереса. Что-то мне подсказывает, что БДЕ заместил собою ОДБС (справедливо только для Борландовских продуктов на клиенте).

Ладно, удачи! Приятно было пообщаться.