Ru-Board.club
← Вернуться в раздел «Программы»

» Программа для конвертирования из БД Paradox (*.db)

Автор: KosinAk
Дата сообщения: 17.10.2003 11:57
Подскажите программку, о знающие, для конвертирования файла Paradox (*.db), в любой другой более распространенный сейчас формат - текстовый, там екселевский, подойдет и DBF. С возможностью работы из коммандной строки...
Заранее пребного благодарен...
Автор: tumber
Дата сообщения: 17.10.2003 16:08
KosinAk
Есть у меня еще досовский русский Paradox 4.0, если надо, могу выслать. Архив 1.3 Mb.
Пишется простой скрипт на его встроенном языке, и можно запускать из командной строки.
Естественно, форматы более новых версий он не знает.
Автор: KosinAk
Дата сообщения: 19.10.2003 07:53
Вышли на мыло, плз, попробую. Если есть приложи к письму доку по скриптописанию или/и примеры.
Адрес в твоем личном ящике...
ЗЫ. А как определить версию Paradox?
Автор: tumber
Дата сообщения: 20.10.2003 12:17
Отправил архив и пример скрипта.
Распаковать архив, и путь к распакованному добавить в переменную среды PATH.
Paradox 4.0 не любит длинных имен, все папки, с которыми он работает, должны иметь чисто досовские имена, не более 8 символов, и без расширений. Таблицы - тоже (но, понятно, с расширениями).
Пример export.sc поместить в папку с таблицами, которые надо перекачать, и указать в нем имена таблиц. Пусть это папка C:\WORK, тогда запуск производится так:

cd C:\WORK
paradox export.sc

Но сначала попробуй просто открыть какую-либо таблицу.
Если она содержит типы полей, которых не было в 4.0, то она не откроется.
Может не открыться и по причине языкового драйвера, который задается файлом paradox.sor в папке с paradox'ом. Три таких файла приложены, надо пробовать с каждым.
Автор: apatit
Дата сообщения: 20.10.2003 15:36
Если работаете с Дельфи, то там есть утилита Datapump. С ее помощью можно.
Автор: tumber
Дата сообщения: 20.10.2003 15:39
apatit
Она работает из командной строки?

Добавлено
Похоже, не работает. Если это та самая Datapump:
http://www.geocities.com/poloziouk/IBDataPump.html
Автор: apatit
Дата сообщения: 21.10.2003 07:30
Там идет речь об Interbase Datapump. Я не уверен, что она идентична той, что идет с Дельфи. Кроме того, не уверен, что она работает из командной строки. Там вся последовательность действий по конвертированию осуществляется с помощью виндового мастера.
Автор: ZioniC
Дата сообщения: 07.11.2005 08:22
ребята мне бы тоже желательно помощь, надо 6 баз из 5 парадокса перегнать в что либо более удобное и современное, подскажите во что, и как, желательно. Буду очень благодарен!
Автор: dvs
Дата сообщения: 24.11.2005 11:44
можно использовать похожий скрипт на Питоне:
(использует ODBC для работы и с Paradox и с DB2)

Код: # -*- coding: windows-1251 -*-
import mx.ODBC.Windows as odbc
import time, traceback
import sys
import psyco; psyco.full()
import ordereddict

pdx_PARADOX_DB_NAME = 'pdxdd'

conn22 = None
cursor22 = None
pdx_data = {}

def get_pk_columns(tab):
'''primary keys'''
global pdx_data
pk_columns = []
if len(pk_columns)==0: #уже заполнено
pk_columns = [
col[0]
for col in pdx_data[tab]['columns']
if col[4]==True
]
return tuple(pk_columns)

def insert_data(tab, cols, cur):
try:
sql = 'select %s from %s' % (','.join(cols), tab)
cur.execute(sql)
tab_data = cur.fetchall()
except:
pprint (traceback.print_exc())
pprint (sql)
sys.exit(444)

if len(tab_data)==0:
print "No data in source table"
return

pprint ("COLS", cols)
sql_ins = ( "Insert into pdx."+ tab.replace('-','_') + # шаблон SQLя на вставку
" (%s)" % ','.join(cols) +
' values (%s)' % ','.join('?'* len(cols) )
)
print sql_ins

try:
#db2cur.executemany(sql_ins, tab_data);
for_exc = []
for i,dat in enumerate(tab_data): #tmp, uncomment EXECUTEMANY
for_exc =dat
rstripped_dat=[]
for d in dat:
rstripped_dat.append(isinstance(d,str) and d.rstrip() or d)

db2cur.execute(sql_ins, tuple(rstripped_dat))

conn22.commit()
print "inserted %d rows \n" % len(tab_data)
except Warning:
pass
except:
print "--------------------------"
print traceback.print_exc(),'\n',for_exc
print 'for_exc:'
for i,fe in enumerate(for_exc):
print cols[i],"\t'"+str(fe)+"'"#,
conn22.close()
sys.exit(333)

def get_db2_cursor():
global cursor22
global conn22
if cursor22 is None:
conn22=get_db2_conn()
cursor22=conn22.cursor()
return cursor22
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def get_db2_conn():
global conn22
if conn22 is None:
conn22=odbc.connect(db2_DB2_DB_NAME, db2_DB2_DB_UID, db2_DB2_DB_PASS)
return conn22
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def get_pdx_tab_data():
global pdx_data
conn = odbc.connect(pdx_PARADOX_DB_NAME)
cur = conn.cursor()
cur.tables()
tables=cur.fetchall()
for tab in tables:
tabname = tab[2]
print "\n","="*10, tabname,"="*10
try:
pdx_data[ tabname ] = {'comment': (tab[4] is None) and ' ' or tab[4]}
pdx_data[ tabname ]['columns']=[]
cur.columns(table=tabname)
cols_ds = cur.fetchall() # 'ds' mean DataSet
cold = {}
for col in cols_ds:
cold[col[3]]=col
cols_ds2 = []
for col in cols_ds:
if col in cold.values():
cols_ds2.append(col)

cols_ds = cols_ds2

cur.primarykeys(table=tabname)
pk_ds = cur.fetchall()

cur.foreignkeys(primary_table=tabname)
fk_ds = cur.fetchall()

for col in cols_ds:

col_name=col[3]

fk_tuple=[]
for fk in fk_ds:
if fk[3]==col_name:
fk_tuple.append( (fk[5]+'.'+fk[6], fk[7]) )

pdx_data[tabname]['columns'].append((
#name
col_name,
col[11] is None and ' ' or col[11], #comment
col[5], col[6], # type len
#pk?
col_name in [pk[3] for pk in pk_ds],
#fk
tuple(fk_tuple)
))

#26.05.2004
pdx_data[ tabname ]['columns']=tuple( pdx_data[ tabname ]['columns'] )

except:
print traceback.print_exc()
sys.exit(555)

print cols_ds

print >> del_from_all, "Delete from pdx.%s;" % tabname.replace('-','_')

return pdx_data

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def main():
global pdx_data
db2cur = get_db2_cursor()
create = ""
crea_file = open("create_pdx_table.sql","w")

global del_from_all

del_from_all = open("del_from_all_pdx_table.sql","w")
inserts = ""

pdx_data = get_pdx_tab_data()

for k,v in pdx_data.items():

print "#"*10,k,"#"*10
for kk,vv in v.items():
print kk,vv
print
create += "Create table pdx.%s (\n" % k.replace('-','_')
cols = []
pk_cols = get_pk_columns(k)
for col in v['columns']:
crea = " %s " % col[0]

sql_type = col[2]
#sql types
if sql_type in ('LONG INTEGER','AUTOINCREMENT'):
crea += "INTEGER"
elif sql_type=='ALPHA': crea += "varCHAR (%d)" %col[3]
elif sql_type=='SHORT': crea += "SMALLINT"
elif sql_type=='NUMBER': crea += "FLOAT"
elif sql_type=='DATE': crea += "DATE"

else:
print sql_type, col[5]
sys.exit()

if col[0] in pk_cols:
crea += " NOT NULL"

cols.append(crea)

create +=",\n".join(cols)
if len(pk_cols)>0:
create += "\n, primary key (%s)" % (",".join(pk_cols))
create += "); \n\n"

# PK !!
print "\n get_pk_columns(k)",get_pk_columns(k)


print "\n*************** INSERT ****************"

if len(sys.argv)>1 and sys.argv[1]=="ins" :
insert_data(k,[col[0] for col in v['columns']], cur)

db2cur.commit()

else:
print "Usage:\n python pdx.py [ins]"

print >> crea_file, create

if __name__=='__main__':
main()
Автор: tumber
Дата сообщения: 24.11.2005 14:06
ZioniC
17 дней прошло, надо полагать, проблема уже решена.
А если нет, то 6 баз можно и вручную в Access импортировать.

Страницы: 1

Предыдущая тема: netboy


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.