我的Python代码中的SQL语句有什么问题?

我的Python代码中的SQL语句有什么问题?,python,sql,python-3.x,azure,azure-sql-database,Python,Sql,Python 3.x,Azure,Azure Sql Database,我正在开发一个简单的清单应用程序,可以管理硬件和软件清单。现在,我只是想简单地将用户输入到文本框中的数据输入到我的数据库中。程序运行,但当我输入文本并单击按钮输入数据时,光标旋转一秒钟,应用程序关闭。有什么想法吗?我尝试了sql语句的多种格式。我曾经在它输入空白/空行的地方得到过它。打印功能只是为了确保我正在从文本框中检索数据 from PyQt5.QtWidgets import (QLabel, QPushButton, QLineEdit, QApplication, QCheckBox,

我正在开发一个简单的清单应用程序,可以管理硬件和软件清单。现在,我只是想简单地将用户输入到文本框中的数据输入到我的数据库中。程序运行,但当我输入文本并单击按钮输入数据时,光标旋转一秒钟,应用程序关闭。有什么想法吗?我尝试了sql语句的多种格式。我曾经在它输入空白/空行的地方得到过它。打印功能只是为了确保我正在从文本框中检索数据

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”的新数据库,其中包含一个名为“Hardware”的表,如下所示:

我尝试了你的代码,但一切都非常适合我:

根据您提供的所有信息,一切正常,因此请检查您的表设计,是否已将本地公共IP添加到Azure SQL防火墙规则中(以将本地公共规则添加到Azure SQL防火墙)

有时,Azure Portal检测到的公共IP地址不太准确,您可以重新检查您的IP地址


如果这两点不能解决您的问题,请向我提供一些详细的异常信息。

我的IP已添加,防火墙已正确设置。我之所以知道这一点,是因为我获取了enterNewHardware函数代码并将其放入自己的py文件中,从数据变量中删除了textbox变量,只添加了文字字符串。它工作并输入数据。在我的文本框变量和数据库之间。它不喜欢什么东西。我还创建了一个名为“HardwareTree”的新硬件表,只是为了测试,所以在这里重命名了它

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内容包装在一个try中检查异常,除了在
enterNewHardware
函数中之外?没有,但我会尝试一下,看看会发生什么。我知道,如果您的问题已经解决,请标记我的帖子或您自己的帖子作为结束此问题的答案:)感谢Stanley的帮助,老实说,我不知道它是什么,但我只是从我的原始帖子中复制并粘贴了SQL语句,然后返回到我的代码中,它神奇地工作了。我已经找了两天,玩了两天,我一辈子都没发现有什么不对劲。再次感谢。很高兴能帮忙:)