【问题标题】:No Result on pyodbc querypyodbc 查询没有结果
【发布时间】:2020-03-02 14:26:35
【问题描述】:

我已经解决了这个脚本的一些问题,但这个问题目前正在阻止我死在我的轨道上。它甚至不再返回错误,从我收集的信息来看,它应该可以工作,我处于“这不应该发生”阶段。我对 python 很陌生,但每天都在学习,迫不及待地想通过这条路来创造很棒的东西!

如果没有 fselemptext = ("'" + selemptext + "'"),我也遇到了同样的错误,通常你需要 MSSQL 上的引号,我想我也需要在这里添加它们。如果我按原样查询并替换 ?通过“用户名”,它可以完美运行。

import tkinter as tk
from tkinter import *
from tkinter import ttk
import pyodbc
import pandas as pd

root = Tk()
root.title('ONE')
root.iconbitmap('Y:\APPLICATIONS\ICONS\ONE_icon.ico')
root.geometry("1700x1000")
frm = Frame(root)

server = 'GDLAP009'
database = 'cwwebapp_gdl'
username = 'reporting'
password = '########'

conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';    DATABASE='+database+';UID='+username+';PWD='+ password)
c = conn.cursor()
query = ("""    SELECT 
                Time_Sheet.Time_Sheet_RecID, 
                Time_Sheet.TE_Period_RecID, 
                TE_Period.Period, 
                TE_Period.Date_Start, 
                TE_Period.Date_End, 
                Time_Sheet.Member_RecID, 
                Time_Sheet.TE_Status_ID,
                Member.Member_ID
                FROM Time_Sheet
                INNER JOIN Member ON Time_Sheet.Member_RecID = Member.Member_RecID 
                INNER JOIN TE_Status ON Time_Sheet.TE_Status_ID = TE_Status.TE_Status_ID 
                INNER JOIN TE_Period ON Time_Sheet.TE_Period_RecID = TE_Period.TE_Period_RecID 
                WHERE Member.Member_ID LIKE ? """)

def searchemp():
    c.execute(query, (fselemptext))
    erecords = c.fetchall()
    c.close()
    return erecords
    for record in erecords:
        tv.insert('', 'end', values=record)

yoptions = ["2016", "2017", "2018", "2019", "2020"]

clky_b = StringVar()
clky_b.set(yoptions[4])

drpy_l = Label(root, text="Select Year")
drpy_l.grid(row=0, column=2, padx=20, pady=10)
drpy_b = OptionMenu(root, clky_b, *yoptions)
drpy_b.grid(row=0, column=3, padx=20, pady=10, columnspan=2)

emptext = StringVar()
sele_l = Label(root, text="Select Employee")
sele_l.grid(row=0, column=0, padx=20, pady=10)
sele_e = Entry(root, width=30, textvariable=emptext)
sele_e.grid(row=0, column=1, padx=20, pady=10)
emptext.set("Default Value")
selemptext = emptext.get()
fselemptext = ("'" + selemptext + "'")

runq_b = Button(root, text="Run Query", command=searchemp)
runq_b.grid(row=0, column=5, columnspan=2, padx=20, pady=10, ipadx=100)

frm.grid(row=50, column=0, padx=20, columnspan=8)
tv = ttk.Treeview(frm, columns=(1,2,3,4,5,6,7,8), show="headings", height="45")
tv.pack()
tv.heading(1, text="Name")
tv.heading(2, text="Time")
tv.heading(3, text="Test1")
tv.heading(4, text="Test2")
tv.heading(5, text="Test3")
tv.heading(6, text="Test4")
tv.heading(7, text="Test5")
tv.heading(8, text="Test6")

root.mainloop()

【问题讨论】:

  • for record in erecords: 由于return erecords,这个循环永远不会被执行
  • 对不起,被评论了,又忘记了,即使没有它,它也不起作用

标签: python tkinter pyodbc


【解决方案1】:

您的代码中有几个问题:

  • 您在创建条目后大约一毫秒从条目中获取值。用户将没有机会输入任何内容。您需要在需要数据时调用get 方法。

  • 使用参数化查询时,您不需要引用这些值。

  • 您需要将一个元组传递给execute 方法。 (fselemptext) 不是元组。 (fselemptext,) 是一个元组。

  • searchemp 函数的中间有一个 return 语句,这将阻止执行任何进一步的代码。您需要删除 return 声明。

  • 您可能不应该调用 c.close()。在一个范围内创建游标并在另一个范围内关闭它是非常奇怪的。将其放入函数中将阻止该函数再次工作。要么删除它,要么让函数创建然后关闭它自己的光标。

您可以将所有这些更改包装到您的 searchemp 函数中:

def searchemp():
    selemptext = emptext.get()
    c.execute(query, (fselemptext,))
    erecords = c.fetchall()

    for record in erecords:
        tv.insert('', 'end', values=record)

【讨论】:

  • 非常感谢您的帮助!使用 get() 函数确实可以解决问题!我也会解决其他问题!
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 2013-11-30
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多