python - 尝试使用 pyodbc 和 tkinter 将记录插入 SQL Server
问题描述
我正在尝试编写一个在添加新设备时可以轻松更新数据库的应用程序。到目前为止,我能够连接到 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 不支持命名参数。
您可以尝试使用位置参数而不是命名参数:
cursor.execute(
"INSERT INTO LAB.dbo.LabSystem VALUES (?, ?, ?)",
EquipmentName.get(),
HostName.get(),
ValidationName.get()
)
推荐阅读
- css - 一些右对齐的 tabPanels 闪亮
- java - netbeans java检查本地服务是否正在运行
- pyspark - 使用 pyspark 将镶木地板数据写入 csv 时出现“不支持的编码:DELTA_BYTE_ARRAY”
- java - 以编程方式将命令行参数传递给 schemacrawler
- scala - 用户定义的值类给出编译错误
- javascript - 我将如何创建一个反转高阶函数?
- alfresco - CMIS ACL 仅删除用户权限(在 Alfresco 上)
- ffmpeg - 如何使用ffmpeg设置覆盖的不透明度/透明度?
- css - 在不编写 hacky CSS 的情况下,如何确保 1 列网格不会从视口中溢出?
- jquery - flipster.js - onItemSwitch 似乎在我单击当前项目时触发