循环在第一个Cursor.execute()之后停止



使用pyodbc,我试图在Excel中循环遍历工作表,读取以字符串"开头的工作表;"预约";,然后将结果写入Access DB中的现有表中。

我能够循环浏览所有的表格,并识别以";预约";(其中有四个-预约1、预约2等(。我还可以读取找到的任何一张表上的数据,并将结果写入DB表。当我试图在for循环中完成所有这些操作时,我可以获得所有的工作表名称,但一旦我执行((select语句,循环就会停止。

它不会出错-print((语句有效,但循环只在第二个print语句之后停止。如果我对第二个print((进行注释,第一个print将返回四个结果。

Cursor.commit()不会改变行为。

# execute select stmt
def select_xls_data(tbl_name):
select_stmt_XLS = 'SELECT * from [' + tbl_name + ']'
result_XLS = crsr_XLS.execute(select_stmt_XLS).fetchall()
return result_XLS
# loop through XLS sheets
for table_info in crsr_XLS.tables():
tbl_name = table_info.table_name
if (tbl_name.startswith('Appointment')):
print(tbl_name)  # will succesfully loop through all sheets
print(select_xls_data(tbl_name))  # will only loop once

select语句中的语法似乎不正确,应该是:

select_stmt_XLS = 'SELECT * from ' + tbl_name + ''

我仍然不知道为什么循环在我最初的问题中停止,但我重写了代码以实现我的目标。

新代码做到了:

  1. 循环浏览文件中的所有表,并将感兴趣的表添加到列表中
  2. 循环浏览创建的列表,并为每个感兴趣的表执行select语句
  3. 将每个选择的结果添加到结果列表中
def select_xls_data(tbl_name):
select_stmt_XLS = 'SELECT * from ' + tbl_name
result_XLS = crsr_XLS.execute(select_stmt_XLS).fetchall()
return result_XLS
# discover the tables of interest and write their names to a list
tables = []
for table_info in crsr_XLS.tables():
tbl_name = table_info.table_name
if (tbl_name.startswith('Appointment')): tables.append('['+tbl_name+']')
# loop through tables of interest, execute select stmt on each and append each result set to a list
results = []
for tbl_name in tables: results.append(select_xls_data(tbl_name))

最新更新