def query_data(self, new_window): # 获取输入框中的数据 data = self.input_box.text().split(",") if len(data) != 2 or not all(map(lambda x: x.strip(), data)): self.status_label.setText("输入格式错误!请按照 部门/姓名/性别/职位/工号/状态,对象 格式输入。") return # 执行 SQL 查询语句 sql = "select * from Staff where (?) = (?)" self.cursor.execute(sql) # 获取查询结果并显示在表格中 rows = self.cursor.fetchall() self.table = QTableWidget() if rows: self.table.setRowCount(len(rows)) self.table.setColumnCount(len(rows[0])) for i, row in enumerate(rows): for j, col in enumerate(row): item = QTableWidgetItem(str(col)) self.table.setItem(i, j, item) self.table.setHorizontalHeaderLabels(["部门", "姓名", "性别", '职位', '工号', '状态']) self.table.horizontalHeader().setVisible(True) self.v_layout = QVBoxLayout(new_window) self.v_layout.addWidget(self.input_box) # 添加表格到新窗口中 self.v_layout.addWidget(self.table) new_window.setLayout(self.v_layout) new_window.show()查错
时间: 2024-02-14 18:06:41 浏览: 144
根据你提供的代码,`self.cursor.execute(sql)` 执行的是一个 SQL 查询语句,但是并没有将查询语句中的参数 `(?)` 和 `(?)` 进行替换。因此,在执行 `self.cursor.execute(sql)` 时会出现错误。
你需要将查询语句的 `(?)` 替换为具体的参数值。可以使用 `pyodbc` 模块提供的 `execute` 方法的第二个参数来替换这些参数。例如:
```
sql = "select * from Staff where {} = ?".format(data[0])
self.cursor.execute(sql, (data[1],))
```
这个语句中,`{}` 是一个格式化字符串,用于将 `data[0]` 插入到 SQL 查询语句中。然后,使用 `self.cursor.execute(sql, (data[1],))` 方法执行 SQL 查询语句,并将 `data[1]` 作为参数传递给查询语句中的 `(?)`。
你还需要注意,`self.input_box` 没有在代码中定义,因此在运行代码时可能会引发错误。
希望这可以帮助你解决问题。
相关问题
def delete_data(self): # 创建一个新窗口,并设置其属性 status_label = QLabel() new_window = QWidget(self) new_window.setWindowTitle("删除员工信息") new_window.setGeometry(200, 200, 500, 300) # 创建返回按钮并设置其属性 return_button = QPushButton("返回", new_window) return_button.clicked.connect(new_window.close) return_button.clicked.connect(self.window.show) # 设置输入框 self.input_box = QLineEdit(new_window) status_label.setText("输入需要删除的对象,格式为:部门/姓名/性别/职位/工号/状态,对象") # 设置删除按钮 delete_button = QPushButton("删除",new_window) delete_button.clicked.connect(self.delete) # 添加表格、按键到新窗口中 self.v_layout = QVBoxLayout(new_window) self.v_layout.addWidget(status_label) self.v_layout.addWidget(self.input_box) self.v_layout.addWidget(return_button) self.v_layout.addWidget(status_label) new_window.setLayout(self.v_layout) new_window.show() def delete(self): # 获取输入框中的数据 data = self.input_box.text().split(",") if len(data) != 2 or not all(map(lambda x: x.strip(), data)): self.status_label.setText("输入格式错误!请按照 部门/姓名/性别/职位/工号/状态,对象 的格式输入。") return # 执行 SQL 删除语句 sql = "DELETE FROM Staff WHERE {} = (?)".format(data[0]) self.cursor.execute(sql, (data[1],)) try: self.cursor.execute(sql, data[0]) self.cnxn.commit() self.query("SELECT * FROM Staff") self.status_label.setText("数据删除成功!") except: self.status_label.setText("数据删除失败!")查错
在 delete() 函数中,有如下两个问题需要修改:
1. 在执行 SQL 删除语句时,使用了 data[0] 作为字段名,但应该使用占位符 '?',然后将 data[1] 作为参数传入 execute() 函数中。
2. 在执行完 SQL 删除语句后,应该将结果进行提交(commit())。在这里,你已经执行了两次 execute() 函数,导致提交时出错。
修改后的 delete() 函数代码如下:
```
def delete(self):
# 获取输入框中的数据
data = self.input_box.text().split(",")
if len(data) != 2 or not all(map(lambda x: x.strip(), data)):
self.status_label.setText("输入格式错误!请按照 部门/姓名/性别/职位/工号/状态,对象 的格式输入。")
return
# 执行 SQL 删除语句
sql = "DELETE FROM Staff WHERE {} = ?".format(data[0])
try:
self.cursor.execute(sql, (data[1],))
self.cnxn.commit()
self.query("SELECT * FROM Staff")
self.status_label.setText("数据删除成功!")
except:
self.status_label.setText("数据删除失败!")
```
修改后再次运行程序,应该可以正常执行删除操作了。
def add_data(self): # 创建一个新窗口,并设置其属性 new_window = QWidget() new_window.setWindowTitle("添加员工信息") new_window.setGeometry(200, 200, 400, 300) self.input_box = QLineEdit() self.input_box.setPlaceholderText("输入数据,格式为:部门,姓名,性别,职位,工号,状态") self.v_layout.addWidget(self.input_box) # 获取输入框中的数据 data = self.input_box.text().split(",") if len(data) != 6: self.status_label.setText("输入格式错误!请按照 部门,姓名,性别,职位,工号,状态 的格式输入。") return # 执行 SQL 插入语句 sql = "INSERT INTO mytable (部门, 姓名, 性别, 职位, 工号, 状态) VALUES (?, ?, ?, ?, ?, ?)" try: self.cursor.execute(sql, data) self.cnxn.commit() self.query("SELECT * FROM Staff") self.status_label.setText("数据添加成功!") except: self.status_label.setText("数据添加失败!") new_window.setLayout(self.v_layout)在打开同时关闭已打开的父窗口
这段代码中,如果想要在打开同时关闭已打开的父窗口,可以在打开新窗口时传入父窗口参数,并在新窗口中创建一个返回按钮,点击该按钮时关闭当前窗口并返回到父窗口。具体实现方法可以参考如下代码:
```
def add_data(self):
# 创建一个新窗口,并设置其属性
new_window = QWidget(self)
new_window.setWindowTitle("添加员工信息")
new_window.setGeometry(200, 200, 400, 300)
# 创建返回按钮并设置其属性
return_button = QPushButton("返回", new_window)
return_button.setGeometry(10, 10, 50, 30)
return_button.clicked.connect(new_window.close)
self.input_box = QLineEdit()
self.input_box.setPlaceholderText("输入数据,格式为:部门,姓名,性别,职位,工号,状态")
self.v_layout.addWidget(self.input_box)
# 获取输入框中的数据
data = self.input_box.text().split(",")
if len(data) != 6:
self.status_label.setText("输入格式错误!请按照 部门,姓名,性别,职位,工号,状态 的格式输入。")
return
# 执行 SQL 插入语句
sql = "INSERT INTO mytable (部门, 姓名, 性别, 职位, 工号, 状态) VALUES (?, ?, ?, ?, ?, ?)"
try:
self.cursor.execute(sql, data)
self.cnxn.commit()
self.query("SELECT * FROM Staff")
self.status_label.setText("数据添加成功!")
except:
self.status_label.setText("数据添加失败!")
new_window.setLayout(self.v_layout)
new_window.show()
self.hide() # 隐藏父窗口
```
阅读全文