pyodbc 查询无结果

No Result on pyodbc query

我已经解决了这个脚本的一些问题,但这个问题目前让我无法继续前进。它甚至不再是 return 错误,据我所知,它应该可以工作,我正处于 "This shouldn't happen" 阶段。我是 python 的新手,但每天都在学习,迫不及待地想沿着这条路走下去,创造出很棒的东西!

我在没有 fselemptext = ("'" + selemptext + "'") 的情况下也遇到了同样的错误,通常你需要在 MSSQL 上引用,我想我也需要在这里添加它们。如果我按原样接受查询并替换?来自 'username' 它完美无缺。

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()

你的代码有几个问题:

  • 您在创建条目后大约一毫秒从条目中获取值。用户将没有机会输入任何内容。您需要在需要数据时调用 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)