我的 Python 代码中的 SQL 语句有什么问题?
What is wrong with this SQL statement in my Python code?
我正在开发一个简单的库存应用程序,它将管理硬件和软件库存。现在我只是想简单地将用户输入文本框的数据输入到我的数据库中。程序运行,但是当我输入文本并单击按钮输入数据时,光标旋转了一秒,应用程序关闭。有任何想法吗?我为 sql 语句尝试了多种格式。我有一次在它进入 blank/null 行的地方得到了它。打印功能只是为了确保我从文本框中检索数据。
from PyQt5.QtWidgets import (QLabel, QPushButton, QLineEdit, QApplication, QCheckBox, QMainWindow, QWidget,
QVBoxLayout, QTabWidget, QStatusBar)
import pyodbc
import sys
class mainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(385, 323)
self.setWindowTitle("HARDWARE | SOFTWARE MANAGER")
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)
self.tabForm = QTabWidget()
self.tabForm.addTab(hardwareTab(), "HARDWARE")
self.tabForm.addTab(softwareTab(), "SOFTWARE")
self.setCentralWidget(self.tabForm)
class hardwareTab(QWidget):
def __init__(self):
super().__init__()
self.snLabel = QLabel("SERIAL NUMBER")
self.snTextBox = QLineEdit()
self.modelLabel = QLabel("MODEL")
self.modelTextBox = QLineEdit()
self.userLabel = QLabel("USER")
self.userTextBox = QLineEdit()
self.enButton = QPushButton("ENTER NEW HARDWARE")
self.cfButton = QPushButton("CLEAR FIELDS")
self.seButton = QPushButton("SEARCH/EDIT HARDWARE")
self.activeCheckbox = QCheckBox("ACTIVE")
self.testTextbox = QLineEdit()
layout = QVBoxLayout(self)
layout.addWidget(self.snLabel)
layout.addWidget(self.snTextBox)
layout.addWidget(self.modelLabel)
layout.addWidget(self.modelTextBox)
layout.addWidget(self.userLabel)
layout.addWidget(self.userTextBox)
layout.addWidget(self.activeCheckbox)
layout.addWidget(self.enButton)
layout.addWidget(self.cfButton)
layout.addWidget(self.seButton)
layout.addWidget(self.testTextbox)
self.enButton.clicked.connect(lambda: enterNewHardware(self))
class softwareTab(QWidget):
def __init__(self):
super().__init__()
self.snLabel = QLabel("SERIAL NUMBER / KEY")
self.snTextbox = QLineEdit()
self.nameLabel = QLabel("APPLICATION NAME")
self.nameTextBox = QLineEdit()
self.userLabel = QLabel("USER")
self.userTextBox = QLineEdit()
self.enButton = QPushButton("ENTER NEW SOFTWARE")
self.cfButton = QPushButton("CLEAR FIELDS")
self.seButton = QPushButton("SEARCH/EDIT SOFTWARE")
layout = QVBoxLayout(self)
layout.addWidget(self.snLabel)
layout.addWidget(self.snTextbox)
layout.addWidget(self.nameLabel)
layout.addWidget(self.nameTextBox)
layout.addWidget(self.userLabel)
layout.addWidget(self.userTextBox)
layout.addWidget(self.enButton)
layout.addWidget(self.cfButton)
layout.addWidget(self.seButton)
def enterNewHardware(textboxes):
serial_number = textboxes.snTextBox.text()
model_name = textboxes.modelTextBox.text()
user_name = textboxes.userTextBox.text()
test_textbox = textboxes.testTextbox.text()
print(serial_number)
print(model_name)
print(user_name)
print(test_textbox)
azureServer = "pythonserver6974.database.windows.net"
azureDB = "inventoryDatabase"
userName = "na"
password = "na"
driver = "{ODBC Driver 17 for SQL Server}"
connectionString = f"DRIVER={driver};SERVER={azureServer};PORT=1433;DATABASE={azureDB};UID={userName};PWD={password}"
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
sql_statement = 'INSERT INTO inventoryDatabase.dbo.Hardware (serialNumber, modelName, userName, machineActive) VALUES (?, ?, ?, ?)'
data = (serial_number, model_name, user_name, test_textbox)
cursor.execute(sql_statement, data)
conn.commit()
if __name__ == "__main__":
APP = QApplication(sys.argv)
WINDOW = mainWindow()
WINDOW.show()
sys.exit(APP.exec_())
您的代码非常适合我,我创建了一个名为“inventoryDatabase”的新数据库,其中 table 名为“硬件”,如下所示:
我在我这边试过你的代码,但一切都很适合我:
根据您提供的所有信息,一切正常,请检查您的 table 设计并是否已将本地 public IP 添加到 Azure SQL 防火墙规则(see here 将本地 public 规则添加到 Azure SQL 防火墙)?
有时候,Azure Portal 检测到的您的 public IP 地址不是那么准确,您可以仔细检查您的 IP here.
如果这2点不能解决你的问题,请提供一些详细的异常信息给我。
我的 IP 已添加,我的防火墙设置正确。我之所以知道这是因为我获取了 enterNewHardware 函数代码并将其放入它自己的 py 文件中,从数据变量中删除了文本框变量并仅添加了文字字符串。这有效并输入数据。我的文本框变量和数据库之间的东西。它不喜欢什么。我还创建了一个名为“HardwareThree”的新硬件 table 只是为了测试,所以它在这里重命名。
import pyodbc
azureServer = "pythonserver5874.database.windows.net"
azureDB = "inventoryDatabase"
userName = "na"
password = "na"
driver = "{ODBC Driver 17 for SQL Server}"
connectionString = f"DRIVER={driver};SERVER={azureServer};PORT=1433;DATABASE=
{azureDB};UID={userName};PWD={password}"
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
sql_statement = '''INSERT INTO inventoryDatabase.dbo.HardwareThree (serialNumber,
modelName, userName, machineActive)
VALUES (?, ?, ?, ?)'''
data = ('Test', 'Test', 'Test', 'Test')
cursor.execute(sql_statement, data)
conn.commit()
cursor.commit()
conn.close()
我正在开发一个简单的库存应用程序,它将管理硬件和软件库存。现在我只是想简单地将用户输入文本框的数据输入到我的数据库中。程序运行,但是当我输入文本并单击按钮输入数据时,光标旋转了一秒,应用程序关闭。有任何想法吗?我为 sql 语句尝试了多种格式。我有一次在它进入 blank/null 行的地方得到了它。打印功能只是为了确保我从文本框中检索数据。
from PyQt5.QtWidgets import (QLabel, QPushButton, QLineEdit, QApplication, QCheckBox, QMainWindow, QWidget,
QVBoxLayout, QTabWidget, QStatusBar)
import pyodbc
import sys
class mainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(385, 323)
self.setWindowTitle("HARDWARE | SOFTWARE MANAGER")
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)
self.tabForm = QTabWidget()
self.tabForm.addTab(hardwareTab(), "HARDWARE")
self.tabForm.addTab(softwareTab(), "SOFTWARE")
self.setCentralWidget(self.tabForm)
class hardwareTab(QWidget):
def __init__(self):
super().__init__()
self.snLabel = QLabel("SERIAL NUMBER")
self.snTextBox = QLineEdit()
self.modelLabel = QLabel("MODEL")
self.modelTextBox = QLineEdit()
self.userLabel = QLabel("USER")
self.userTextBox = QLineEdit()
self.enButton = QPushButton("ENTER NEW HARDWARE")
self.cfButton = QPushButton("CLEAR FIELDS")
self.seButton = QPushButton("SEARCH/EDIT HARDWARE")
self.activeCheckbox = QCheckBox("ACTIVE")
self.testTextbox = QLineEdit()
layout = QVBoxLayout(self)
layout.addWidget(self.snLabel)
layout.addWidget(self.snTextBox)
layout.addWidget(self.modelLabel)
layout.addWidget(self.modelTextBox)
layout.addWidget(self.userLabel)
layout.addWidget(self.userTextBox)
layout.addWidget(self.activeCheckbox)
layout.addWidget(self.enButton)
layout.addWidget(self.cfButton)
layout.addWidget(self.seButton)
layout.addWidget(self.testTextbox)
self.enButton.clicked.connect(lambda: enterNewHardware(self))
class softwareTab(QWidget):
def __init__(self):
super().__init__()
self.snLabel = QLabel("SERIAL NUMBER / KEY")
self.snTextbox = QLineEdit()
self.nameLabel = QLabel("APPLICATION NAME")
self.nameTextBox = QLineEdit()
self.userLabel = QLabel("USER")
self.userTextBox = QLineEdit()
self.enButton = QPushButton("ENTER NEW SOFTWARE")
self.cfButton = QPushButton("CLEAR FIELDS")
self.seButton = QPushButton("SEARCH/EDIT SOFTWARE")
layout = QVBoxLayout(self)
layout.addWidget(self.snLabel)
layout.addWidget(self.snTextbox)
layout.addWidget(self.nameLabel)
layout.addWidget(self.nameTextBox)
layout.addWidget(self.userLabel)
layout.addWidget(self.userTextBox)
layout.addWidget(self.enButton)
layout.addWidget(self.cfButton)
layout.addWidget(self.seButton)
def enterNewHardware(textboxes):
serial_number = textboxes.snTextBox.text()
model_name = textboxes.modelTextBox.text()
user_name = textboxes.userTextBox.text()
test_textbox = textboxes.testTextbox.text()
print(serial_number)
print(model_name)
print(user_name)
print(test_textbox)
azureServer = "pythonserver6974.database.windows.net"
azureDB = "inventoryDatabase"
userName = "na"
password = "na"
driver = "{ODBC Driver 17 for SQL Server}"
connectionString = f"DRIVER={driver};SERVER={azureServer};PORT=1433;DATABASE={azureDB};UID={userName};PWD={password}"
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
sql_statement = 'INSERT INTO inventoryDatabase.dbo.Hardware (serialNumber, modelName, userName, machineActive) VALUES (?, ?, ?, ?)'
data = (serial_number, model_name, user_name, test_textbox)
cursor.execute(sql_statement, data)
conn.commit()
if __name__ == "__main__":
APP = QApplication(sys.argv)
WINDOW = mainWindow()
WINDOW.show()
sys.exit(APP.exec_())
您的代码非常适合我,我创建了一个名为“inventoryDatabase”的新数据库,其中 table 名为“硬件”,如下所示:
我在我这边试过你的代码,但一切都很适合我:
根据您提供的所有信息,一切正常,请检查您的 table 设计并是否已将本地 public IP 添加到 Azure SQL 防火墙规则(see here 将本地 public 规则添加到 Azure SQL 防火墙)?
有时候,Azure Portal 检测到的您的 public IP 地址不是那么准确,您可以仔细检查您的 IP here.
如果这2点不能解决你的问题,请提供一些详细的异常信息给我。
我的 IP 已添加,我的防火墙设置正确。我之所以知道这是因为我获取了 enterNewHardware 函数代码并将其放入它自己的 py 文件中,从数据变量中删除了文本框变量并仅添加了文字字符串。这有效并输入数据。我的文本框变量和数据库之间的东西。它不喜欢什么。我还创建了一个名为“HardwareThree”的新硬件 table 只是为了测试,所以它在这里重命名。
import pyodbc
azureServer = "pythonserver5874.database.windows.net"
azureDB = "inventoryDatabase"
userName = "na"
password = "na"
driver = "{ODBC Driver 17 for SQL Server}"
connectionString = f"DRIVER={driver};SERVER={azureServer};PORT=1433;DATABASE=
{azureDB};UID={userName};PWD={password}"
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
sql_statement = '''INSERT INTO inventoryDatabase.dbo.HardwareThree (serialNumber,
modelName, userName, machineActive)
VALUES (?, ?, ?, ?)'''
data = ('Test', 'Test', 'Test', 'Test')
cursor.execute(sql_statement, data)
conn.commit()
cursor.commit()
conn.close()