Инструменты: win7 64, python 3.3.4 x86, Excel 2010, Firebird 2.5.2 x64, fdb 1.4
Задача: открыть файл Excel и записать из него данные в БД FB. Особенности - файл из офиса 2003 (7 листов по 65000 элементов, итого примерно 450 000 элементов)
код
# coding: utf-8 from win32com.client import Dispatch import pythoncom import datetime import sys import fdb #================================================================== def main(argv=None): start_time=datetime.datetime.now() print(start_time) fb_conn = fdb.connect(dsn='firebird:d:\\pgn.FDB',user='user',password='password') trans=fb_conn.trans() trans.begin fb_cur=trans.cursor() sql_prep=fb_cur.prep(r"INSERT INTO gpk_input (lat_name,name,to_date) VALUES (?,?,?)") xlApp = Dispatch("Excel.Application") xlApp.Visible=False xlWb = xlApp.Workbooks.Open(r"D:\Documents\children.xls") try: for Sheet in xlWb.WorkSheets: print("Sheet=",Sheet.Name," ",datetime.datetime.now()) for y in range(2,10): if str(Sheet.Cells(y,1)) != 'None': # Sheet.Cells(y,1) - ФИО в латинской транскрипции # Sheet.Cells(y,2) - ФИО на русском # Sheet.Cells(y,3) - дата чего-то . Пока не интересно dt1=str(Sheet.Cells(y,3)) dt1=dt1[0:19] dt1=str(dt1[8:10])+'.'+str(dt1[5:7])+'.'+str(dt1[0:4])+' '+str(dt1[11:]) print(type(Sheet.Cells(y,2))) rus_name=str(Sheet.Cells(y,2)) print(type(rus_name)) print('-------\n','orig=',rus_name) fb_cur.execute(sql_prep,[Sheet.Cells(y,1),rus_name.encode('utf-8'),dt1]) trans.commit() fb_cur.close() trans.close() except Exception as e3: print("main try:","Line "+format(sys.exc_info()[-1].tb_lineno),e3.__str__()) print("Sheet='",Sheet.Name,"' y=",y) trans.rollback() fb_cur.close() trans.close() xlApp.Quit() fin_time=datetime.datetime.now() print(fin_time," | ",fin_time-start_time)
при выполнении из cmd.exe дает такую ошибку
('Error while executing SQL statement:\n- SQLCODE: -413\n- conversion error from string “КАСАТКИНА АЛЕНА”\n- conversion error from string “КАСАТКИНА АЛЕНА”\n- conversion error from string “КАСАТКИНА АЛЕНА”', -413, 335544334)
и при изменении запроса на явное приведение к типу - тоже
r"INSERT INTO gpk_input (lat_name,name,to_date) VALUES (?,CAST(? AS VARCHAR(50)),?)"
Такая же ошибка при инсерте чисто латинской строки, т.е получается вопрос не в кодировке кирилицы (сперва про нее думал)