powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
13 сообщений из 13, страница 1 из 1
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283025
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой код:
==========================================
void __fastcall TMainForm::FormShow(TObject *Sender)
{
DM->DBF->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Password=\"\";User ID=Admin;Data Source="+ExtractFilePath(Application->ExeName)+";Mode=Share Deny None;Extended Properties=dBase IV;Jet OLEDB:System database=\"\";Jet OLEDB:Registry Path=\"\";Jet OLEDB:Database Password=\"\";Jet OLEDB:Engine Type=17;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=\"\";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";
DM->DBF->Connected = true;
command = "create table testdbf(code_firme int,abcount int,code_plat int)";
DM->DBF->Execute(command,cnt,TExecuteOptions()<<eoAsyncFetch);
Sleep(3000);
command = "insert into testdbf(code_firme,abcount,code_plat) values(994,1,1)";
DM->DBF->Execute(command,cnt,TExecuteOptions()<<eoAsyncFetch);
Sleep(3000);
command = "delete from testdbf";
DM->DBF->Execute(command,cnt,TExecuteOptions()<<eoAsyncFetch);
Sleep(3000);
command = "alter table testdbf add id INT PRIMARY KEY IDENTITY";
DM->DBF->Execute(command,cnt,TExecuteOptions()<<eoAsyncFetch);
}
======================================
В папке откуда запускается программа создается таблица DBF, в нее вставляется одна строка, потом она же удаляется, потом структура таблицы изменяется путем добавления нового ключевого поля для счетчика. На последнем вызове Execute вылетает ошибка - "Операция не поддерживается для таблицы, содержащей данные"! Причем если оставить только CREATE и ALTER, то поле добавляется без проблем!
Все это нужно для того чтобы в существующий файл ДБФ с данными (около 50000) добавить поле счетчика дабы однозначно пронумеровать все записи в таблице.
Подскажите как быть плиз.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283032
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитать учебники. В DBF все записи пронумерованы всегда.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283036
гест*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Счетчик обычно инкриментируется при добавлении записей. может и есть какие окольные пути, но вроде самое простое скопировать эту таблицу в другую со столбцом.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283068
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только что попробовал импортировать ДБф-файл в базу MSSQL Servre 2000, в ней инкрементное поле добавляется без ошибок!
============================
к White Owl:
И как же мне узнать номер записи? Как называется это "скрытое" поле?
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283191
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_komogorcevИ как же мне узнать номер записи? Как называется это "скрытое" поле?Recno()
И вообще, ходить к dbf через мост ADO-OLE DB это очень дурная идея.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283282
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к White Owl:
дурная или не дурная, а импорт из программы моей дбф-файло в базу MSSQL 2000 используя АДО самый быстрый по сравнению с БДЕ или TDBF!
=========
и как мне и где вызывать этот самый Recno() ?
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34283475
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_komogorcev пишет:
> изменяется путем добавления нового ключевого поля для счетчика. На
> последнем вызове Execute вылетает ошибка - "Операция не поддерживается
> для таблицы, содержащей данные"! Причем если оставить только CREATE и
> ALTER, то поле добавляется без проблем!

Наверное надо PACK сделать для таблицы. В DBF записи не
удаляются физически никогда, только помечаются что запись удалена.
После этого чтобы физически удалить удаленные записи надо делать PACK,
оно открывает монопольно файл и переписывает его сызнова, сохраняя
только неудаленные записи.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284227
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение задачи:
Есть дбф-файл с около 50000 записей, его нужно импортировать в базу MSSQL Server 2000. Его я хочу открыть при помощи ADOQuery запросом типа: select * top 5000 from file.dbf where id >= :count, где :count - параметр, вычисляющийся программно:
======================
count = 1;
while(count<=reccount){//общее кол-во записей в file.dbf
DM->Qdbftable->Close();
DM->Qdbftable->SQL->Clear();
DM->Qdbftable->SQL->Text = "select top 5000 * from "+ExtractFileName(OpenDialog1->FileName)+" where id >= "+IntToStr(count);
DM->Qdbftable->Open();//читаю из file.dbf следующие 5000 записей
count += 5000;
while(!DM->Qdbftable->Eof){
command="insert into testdbf(id,count) values(";
command+=IntToStr(DM->Qdbftable->FieldByName("id")->AsInteger)+",";
command+=IntToStr(DM->Qdbftable->FieldByName("count")->AsInteger)+")";
//вставляю по одной в таблицу в базу MSSQL Server 2000
DM->base->Execute(command,cnt,TExecuteOptions()<<eoExecuteNoRecords);
Label2->Caption = IntToStr(++i)+" из "+IntToStr(reccount);
DM->Qdbftable->Next();
Application->ProcessMessages();
}
}
======================
Но для всего этого мне нужно добавить в file.dbf поле id дабы пронумеровать все его записи.
Или это не возможно сделать?
Если открыть file.dbf полностью (select * from file.dbf), то записи вставляются медленно (проводил тест - 2 поля типа INTEGER, 200000 записей - вставляются более 10 минут, а если по 5000 - около 4 минут).
DBF-файлы приходят по почте без поля ID, вот мне его и нужно добавить для быстрого импорта в базу.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284329
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В составе MS SQL Server 2000 есть программа DTS (импорт и экспорт данных) может она решит проблему.
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284330
гест*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение задачи:
Есть дбф-файл с около 50000 записей, его нужно импортировать в базу MSSQL Server 2000. Его я хочу открыть при помощи ADOQuery запросом типа: select * top 5000 from file.dbf where id >= :count, где :count - параметр, вычисляющийся программно:

Хмхм. Не кажется ли вам что вы исходную задачу сводите к какой-то индусской ерунде..По моему самое разумное тут воспользоваться стандартным DTS импортом (стартовать пакет из sql) или Linked Server к данному файлу.
могу сказать что 200000 записей - это сущие копейки по времени (Linked Server dbase IV несколько секунд отрабатывает (ну явно не 10 минут))
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284584
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас пока пользуюсь мастером импорта, но дбф-файлов много (более 50) и все они расположены в разных папках, поэтому не слишком удобно. Вот и возникла идея написать программу, где можно открыть каждый из этих 50-ти файлов через ОПЕН ДИАЛОГ и по нажатии кнопки импортировать в базу.
Если бы мастер импорта сохранил пакет так, чтобы можно было передавать ему в качестве параметров путь к дбф-файлу для импорта и имя таблицы-приемника в базе, то проблем бы не было... А так приходится прибегать к индусской ерунде...)))
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284767
гест*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если бы мастер импорта сохранил пакет так, чтобы можно было передавать ему в качестве параметров путь к дбф-файлу для импорта и имя таблицы-приемника в базе, то проблем бы не было...
1) это можно сделать.
2) BOL->OPENROWSET
...
Рейтинг: 0 / 0
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
    #34284913
andrey_komogorcev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно все сделать, если есть права админа, а если их нет то приходится извращаться)))
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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