Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pyodbc从Excel电子表格中提取的数据更新SQL表时出错_Python_Sql_Excel_Pyodbc - Fatal编程技术网

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

Python 使用Pyodbc从Excel电子表格中提取的数据更新SQL表时出错,python,sql,excel,pyodbc,Python,Sql,Excel,Pyodbc,运行以下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;pw

运行以下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和下一次调用cursor.execute之间有不同的数据类型,Sybase不允许这样做

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()
一个快速的解决方法可能是在循环内提交事务。我手头没有Sybase来测试这个

或者,强制将数据转换为正确的格式。我怀疑你混合了字符串、整数和浮点。但你可以强迫它,比如:

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