使用从Excel电子表格中提取的数据更新Pyodbc的SQL表时出错

当运行下面的Python 2.7脚本时,我得到一个pyodbc.Error 。 我使用的Excel电子表格中有4行。

 import pyodbc from mmap import mmap,ACCESS_READ import xlrd import os #for row_index in range(1,sheet0.nrows): cnxn = pyodbc.connect('driver={DB};NetworkAddress=DB_Address,Port;Db=DB;uid=login;pwd=password') cursor = cnxn.cursor() book=xlrd.open_workbook("I:\\CNLD.xlsx") sheet=book.sheet_by_index(0) cell=sheet.cell(1,1) for rownum in range(sheet.nrows): print sheet.row_values(rownum) print sheet.nrows update_dyna = "insert into tempdb..cm_dyna(secsym,pvsym,min_bid_off,min_bid_offpt,min_ask_off,min_ask_offpt,max_bid_off,max_bid_offpt,max_ask_off,max_ask_offpt) values(?,?,?,?,?,?,?,?,?,?)" for row_index in range(1, sheet.nrows): row_num = row_index secsym = sheet.cell(row_index,0).value pvsym = sheet.cell(row_index,1).value min_bid_off = sheet.cell(row_index,2).value min_bid_offpt = sheet.cell(row_index,3).value min_ask_off = sheet.cell(row_index,4).value min_ask_offpt = sheet.cell(row_index,5).value max_bid_off = sheet.cell(row_index,6).value max_bid_offpt = sheet.cell(row_index,7).value max_ask_off = sheet.cell(row_index,8).value max_ask_offpt = sheet.cell(row_index,9).value values = (secsym,pvsym,min_bid_off,min_bid_offpt,min_ask_off,min_ask_offpt,max_bid_off,max_bid_offpt,max_ask_off,max_ask_offpt) cursor.execute(update_dyna,values) cursor.close() cnxn.commit() cnxn.close() 

这里是被踢出的错误信息:

 cursor.execute(update_dyna,values) pyodbc.Error: ('HY000', '[HY000] [DataDirect][ODBC Sybase Wire Protocol driver]Data type for parameter 2 has changed since first SQLExecute call. (0) (SQLExecDirectW)') 

cursor.execute是循环的一部分,所以我不知道为什么我无法更新其中有4行的电子表格。

错误消息告诉你,在一次调用cursor.execute和下一次调用之间你有不同的数据types – 而Sybase不允许这样做。

一个快速的解决方法可能是在循环内提​​交事务。 我没有Sybase的方便testing。

或者,强制您的数据采用正确的格式。 我怀疑你已经混合了string,整数和浮点数。 但是你可以强迫它像这样:

 min_bid_off = float(sheet.cell(row_index,2).value)