我正在尝试编写一个可以在添加新设备时轻松更新数据库的应用程序。到目前为止,我已经能够连接到db并创建了一个GUI以显示一些内容。
现在,我一直试图从用户创建的条目中插入新记录。基本上,用户输入3个值:EquipmentName,HostName和ValidationName,它们将在数据库中创建新记录。
我遇到错误:
第32行,提交中'ValidationName':ValidationName.get()pyodbc.ProgrammingError :('SQL包含0个参数标记,但是提供了1个参数','HY000')
我已经尝试过搜索所有内容,但没有运气
很抱歉,如果这没有意义,这是我第一次尝试使用python进行编码。
from tkinter import *
import pyodbc
#Create application and size
root = Tk()
root.title('Application')
root.geometry("400x400")
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
#Create cursor
cursor = conn.cursor()
cursor.execute('SELECT * FROM LAB.dbo.LabSystem')
#Create submit function for database
def submit():
# Connect to SQL Server database
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Insert into table
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (:EquipmentName, :HostName, :ValidationName)",
{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
})
# Commit changes
conn.commit()
# Close connection
conn.close()
# Clear the text boxes
EquipmentName.delete(0, END)
HostName.delete(0, END)
ValidationName.delete(0, END)
# Create query function
def query():
# Connect to SQl Server DB
conn = pyodbc.connect('Driver={SQL Server};'
'Server=USGRE-PC0XLKJM\SQLEXPRESS;'
'Database=LAB;'
'Trusted_Connection=yes;')
# Create cursor
cursor = conn.cursor()
# Query the database
cursor.execute("SELECT *,SystemID FROM LAB.dbo.LabSystem")
records = cursor.fetchall()
#print(records)
#Loop through results
print_records = ''
for record in records:
print_records += str(record[0]) + " " +str(record[2]) + " " "\n"
query_label = Label(root, text=print_records)
query_label.grid(row=3, column=0, columnspan=2)
# Commit changes
conn.commit()
# Close connection
conn.close()
# Create text boxes
EquipmentName = Entry(root, width=30)
EquipmentName.grid(row=0, column=1, padx=20)
HostName = Entry(root, width=30)
HostName.grid(row=1, column=1)
ValidationName = Entry(root, width=30)
ValidationName.grid(row=2, column=1)
# Create labels for text boxes
EquipmentName_label = Label(root, text="Equipment Name")
EquipmentName_label.grid(row=0, column=0)
HostName_label = Label(root, text="Host Name")
HostName_label.grid(row=1, column=0)
ValidationName_label = Label(root, text="Validation Name")
ValidationName_label.grid(row=2, column=0)
# Create submit button to add entries
submit_btn = Button(root, text="Add record", command=submit)
submit_btn.grid(row=6, column=0, columnspan=2, pady=10, padx=10)
# Create a query button
query_btn = Button(root, text="Show Records", command=query)
query_btn.grid(row=7, column=0, columnspan=2, pady=10, padx=10, ipadx=137)
#Commit changes
conn.commit()
# Close connection
conn.close()
root.mainloop()
就问题而言,pyodbc does not support named parameters。
您可以尝试使用位置参数代替命名参数:
cursor.execute(
"INSERT INTO LAB.dbo.LabSystem VALUES (?, ?, ?)",
EquipmentName.get(),
HostName.get(),
ValidationName.get()
)
您是如此接近,您需要解析dict值-创建一个将dict解析为插入语句的函数
def values_statement(lst):
if lst:
_ = [tuple([str(l).replace("'", "") for l in ls.values()])
for ls in lst]
return ','.join([str(i) for i in _])
我假设final_dict现在只是一行?将其作为字典列表将更加有效。那可行吗?
final_dict = [{
'EquipmentName': EquipmentName.get(),
'HostName': HostName.get(),
'ValidationName': ValidationName.get()
}]
cursor.execute("INSERT INTO LAB.dbo.LabSystem VALUES (EquipmentName, HostName, ValidationName)".format(values_statement(final_dict))
)