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)
我已经解决了这个脚本的一些问题,但这个问题目前让我无法继续前进。它甚至不再是 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)