|
|
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Есть такой код: ========================================== 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) добавить поле счетчика дабы однозначно пронумеровать все записи в таблице. Подскажите как быть плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 17:53 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Почитать учебники. В DBF все записи пронумерованы всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 17:55 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Счетчик обычно инкриментируется при добавлении записей. может и есть какие окольные пути, но вроде самое простое скопировать эту таблицу в другую со столбцом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 17:56 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Только что попробовал импортировать ДБф-файл в базу MSSQL Servre 2000, в ней инкрементное поле добавляется без ошибок! ============================ к White Owl: И как же мне узнать номер записи? Как называется это "скрытое" поле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 18:00 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
andrey_komogorcevИ как же мне узнать номер записи? Как называется это "скрытое" поле?Recno() И вообще, ходить к dbf через мост ADO-OLE DB это очень дурная идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 18:35 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
к White Owl: дурная или не дурная, а импорт из программы моей дбф-файло в базу MSSQL 2000 используя АДО самый быстрый по сравнению с БДЕ или TDBF! ========= и как мне и где вызывать этот самый Recno() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 18:59 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
andrey_komogorcev пишет: > изменяется путем добавления нового ключевого поля для счетчика. На > последнем вызове Execute вылетает ошибка - "Операция не поддерживается > для таблицы, содержащей данные"! Причем если оставить только CREATE и > ALTER, то поле добавляется без проблем! Наверное надо PACK сделать для таблицы. В DBF записи не удаляются физически никогда, только помечаются что запись удалена. После этого чтобы физически удалить удаленные записи надо делать PACK, оно открывает монопольно файл и переписывает его сызнова, сохраняя только неудаленные записи. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 20:34 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Уточнение задачи: Есть дбф-файл с около 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, вот мне его и нужно добавить для быстрого импорта в базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:25 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
В составе MS SQL Server 2000 есть программа DTS (импорт и экспорт данных) может она решит проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:47 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Уточнение задачи: Есть дбф-файл с около 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 минут)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:47 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Сейчас пока пользуюсь мастером импорта, но дбф-файлов много (более 50) и все они расположены в разных папках, поэтому не слишком удобно. Вот и возникла идея написать программу, где можно открыть каждый из этих 50-ти файлов через ОПЕН ДИАЛОГ и по нажатии кнопки импортировать в базу. Если бы мастер импорта сохранил пакет так, чтобы можно было передавать ему в качестве параметров путь к дбф-файлу для импорта и имя таблицы-приемника в базе, то проблем бы не было... А так приходится прибегать к индусской ерунде...))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 11:28 |
|
||
|
Нельзя добавить столбец в DBF-таблицу, когда в ней есть данные
|
|||
|---|---|---|---|
|
#18+
Если бы мастер импорта сохранил пакет так, чтобы можно было передавать ему в качестве параметров путь к дбф-файлу для импорта и имя таблицы-приемника в базе, то проблем бы не было... 1) это можно сделать. 2) BOL->OPENROWSET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 12:03 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34283068&tid=2029570]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 482ms |

| 0 / 0 |
