该功能不适用于所有表

时间:2012-11-08 05:55:03

标签: python sql database ms-access firebird

我通过从Access到Firebird的数据传输编写了以下代码

def getFirebirdFieldNames(firebird_cursor, tablename):
    firebird_cursor.execute('select rdb$field_name from rdb$relation_fields where rdb$relation_name=\'%s\' order by rdb$field_position' % (tablename,))
    field_names = list()
    for c in firebird_cursor.fetchall():
        field_names.append(c[0])
    return field_names

def SelectFromAccessTable(tablename):
    return 'select * from [' + tablename+']'

def InsertToFirebirdTable(tablename, row):
    values=''
    values=values.encode('cp1251', 'replace')
    for i in range(len(row)):
        if (i!=len(row)-1):
                if type(row[i])==int:
                      temp=str(row[i])
                else:
                      if type(row[i])==decimal.Decimal:
                          temp=str(row[i])
                      else:
                          temp='\'%s\'' % (row[i],)
                values+=temp+', '                 
        else:
                if type(row[i])==int:
                      temp=str(row[i])
                else:
                      if type(row[i])==decimal.Decimal:
                          temp=str(row[i])
                      else:
                          temp='\'%s\'' % (row[i],)
                values+=temp
    return 'insert into '+tablename+' values ('+values+')'

def AccessToFirebird(accesstablename, firebirdtablename, accesscursor, firebirdcursor):
    SelectSql=SelectFromAccessTable(accesstablename)
    for row in accesscursor.execute(SelectSql):
        InsertSql=InsertToFirebirdTable(firebirdtablename, row)
        InsertSql=InsertSql
        print InsertSql
        firebirdcursor.execute(InsertSql)

在主程序中调用这些函数

conAcc = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\ThirdTask\Northwind.accdb')
SqlAccess=conAcc.cursor();
conn.begin()
cur=conn.cursor()
sql.AccessToFirebird('Customers', 'CLIENTS', SqlAccess, cur)
conn.commit()
conn.begin()
cur=conn.cursor()
sql.AccessToFirebird('Сотрудники', 'EMPLOYEES', SqlAccess, cur)
conn.commit()
conAcc.commit()
conn.close()
conAcc.close();

由于填写了表CLIENTS,因此未填充EMPLOYEES(Northwind数据库)。为什么? 这是文本输出(sql-query inserts)

insert into EMPLOYEES values (1, 'Борей', 'Ильина', 'Юлия', 'julia@northwindtraders.com', 'Сотрудник отдела сбыта', '(123)555-0100', '(123)555-0102', 'None', '(123)555-0103', '1-й проспект, д. 12', 'Сочи', '(нет)', '999999', 'Россия', '#http://northwindtraders.com#', 'None', '')
insert into EMPLOYEES values (2, 'Борей', 'Гладких', 'Андрей', 'andrew@northwindtraders.com', 'Вице-президент', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '2-й проспект, д. 12', 'Томск', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Принят в компанию в качестве сотрудника отдела сбыта, затем назначен начальником отдела сбыта, в настоящее время занимает должность вице-президента по продажам.', '')
insert into EMPLOYEES values (3, 'Борей', 'Куликов', 'Евгений', 'evgeny@northwindtraders.com', 'Сотрудник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '3-й проспект, д. 12', 'Псков', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Прошел стажировку в отделе сбыта, в настоящее время является штатным сотрудником.', '')
insert into EMPLOYEES values (4, 'Борей', 'Сергиенко', 'Мария', 'mariya@northwindtraders.com', 'Сотрудник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '4-й проспект, д. 12', 'Самара', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'None', '')
insert into EMPLOYEES values (5, 'Борей', 'Новиков', 'Николай', 'nikolay@northwindtraders.com', 'Начальник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '5-й проспект, д. 12', 'Сочи', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Принят в компанию в качестве сотрудника отдела сбыта, затем назначен начальником отдела сбыта. Свободно владеет французским языком.', '')
insert into EMPLOYEES values (6, 'Борей', 'Корепин', 'Вадим', 'vadim@northwindtraders.com', 'Сотрудник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '6-й проспект, д. 12', 'Псков', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Свободно владеет японским языком, читает и пишеть на французском, португальском и испанском.', '')
insert into EMPLOYEES values (7, 'Борей', 'Климов', 'Сергей', 'sergey@northwindtraders.com', 'Сотрудник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '7-й проспект, д. 12', 'Сочи', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'None', '')
insert into EMPLOYEES values (8, 'Борей', 'Ожогина', 'Инна', 'inna@northwindtraders.com', 'Координатор продаж', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '8-й проспект, д. 12', 'Псков', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Читает и пишет по-французски.', '')
insert into EMPLOYEES values (9, 'Борей', 'Попкова', 'Дарья', 'darya@northwindtraders.com', 'Сотрудник отдела сбыта', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '9-я улица, д.12', 'Сочи', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Свободно владеет французским и немецким языком.', '')

P.S。如果尝试在ibexpert中执行请求

 insert into EMPLOYEES values (1, 'Борей', 'Ильина', 'Юлия', 'julia@northwindtraders.com', 'Сотрудник отдела сбыта', '(123)555-0100', '(123)555-0102', 'None', '(123)555-0103', '1-й проспект, д. 12', 'Сочи', '(нет)', '999999', 'Россия', '#http://northwindtraders.com#', 'None', '')

我收到了

can't format message 13:198 -- message file C:\Windows\firebird.msg not found.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.

我还有一个问题来自

insert into EMPLOYEES values (2, 'Борей', 'Гладких', 'Андрей', 'andrew@northwindtraders.com', 'Вице-президент', '(123) 555-0100', '(123) 555-0102', 'None', '(123) 555-0103', '2-й проспект, д. 12', 'Томск', '(нет)', '999999', 'Россия', 'http://northwindtraders.com#http://northwindtraders.com/#', 'Принят в компанию в качестве сотрудника отдела сбыта, затем назначен начальником отдела сбыта, в настоящее время занимает должность вице-президента по продажам.', '')

有一条线

'http://northwindtraders.com#http://northwindtraders.com/#'

而不是

'http://northwindtraders.com'.

1 个答案:

答案 0 :(得分:2)

string right truncation表示您正在尝试插入一个对于列来说太长的字符串。