Попытка вставить запись в SQL Server с помощью pyodbc и tkinter - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь написать приложение, которое будет легко обновлять базу данных при добавлении нового оборудования. Пока я могу подключиться к базе данных и создал графический интерфейс, чтобы показать несколько вещей.

Теперь я застрял при попытке вставить новую запись из записи, которую делает пользователь. Обычно пользователь вводит 3 значения: EquipmentName, HostName и ValidationName, которые создают новую запись в базе данных.

Я получаю сообщение об ошибке:

строка 32, в submit
'ValidationName': ValidationName.get () pyodbc.ProgrammingError: ('SQL содержит 0 маркеров параметров, но были предоставлены 1 параметры', 'HY000')

Я пытался все от Google, но не повезло в

Извините, если это не имеет смысла, я впервые пытаюсь написать код на 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()

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Что касается, pyodbc не поддерживает именованные параметры .

Вы можете попробовать использовать позиционные параметры вместо именованных параметров:

cursor.execute(
    "INSERT INTO LAB.dbo.LabSystem VALUES (?, ?, ?)",
    EquipmentName.get(),
    HostName.get(),
    ValidationName.get()
)
0 голосов
/ 08 октября 2019

Вы так близки, вам нужно проанализировать значения 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))
)

...