如何使用QSqlTableModel和QLineEdit筛选ms访问数据库



我正在构建一个GUI,允许用户在ms访问数据库中搜索信息(是的。必须是ms访问(用户有一个文本字段,可以在其中键入搜索并且Tableview应该立即更新。此时,每当您在字段中键入一个字母时,DB就会消失。

我花了一段时间才发现问题:我的SQL语句根本不对。(感谢model.lastError(

整个功能如下:

self.ui.Kistenschild_suchen.textChanged.connect(self.update_filter)

def update_filter(self, s):
s = re.sub("[W_]+", "", s)
filter_str = 'Produkt LIKE %{}%"'.format(s)
self.ui.model.setFilter(filter_str)
print(self.ui.model.lastError())

在这种情况下,我键入了k

错误消息为:

PySide6.QtSql.QSqlError("-3100", "QODBC: Unable to execute statement", "[Microsoft][ODBC-Treiber für Microsoft Access] Syntaxfehler in Abfrageausdruck 'Produkt LIKE (%h%")'.") at 0x000001CA4FB33B88>

兴趣点应该是"%h%"("'因为它显示的字符比键入的多

我尝试了几种方式进行更改,比如将%更改为*和?仍然没有

编辑:

以下是可重复性最小的示例:

import re
import sys
from PySide6.QtCore import QSize, Qt
from PySide6.QtSql import QSqlDatabase, QSqlTableModel
from PySide6.QtWidgets import (
QApplication,
QLineEdit,
QMainWindow,
QTableView,
QVBoxLayout,
QWidget,
)
Driver= r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:scriptspythonpyside_Tutorialsdatabaseschinook.accdb'
db = QSqlDatabase("QODBC")
db.setDatabaseName(Driver)
db.open()



class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
container = QWidget()
layout = QVBoxLayout()
self.search = QLineEdit()
self.search.textChanged.connect(self.update_filter)
self.table = QTableView()
layout.addWidget(self.search)
layout.addWidget(self.table)
container.setLayout(layout)
self.model = QSqlTableModel(db=db)
self.table.setModel(self.model)
self.model.setTable("Track")
self.model.select()
self.setMinimumSize(QSize(1024, 600))
self.setCentralWidget(container)



# tag::filter[]
def update_filter(self, s):
s = re.sub("[W_]+", "", s)
filter_str = 'Name LIKE "%{}%"'.format(s)
self.model.setFilter(filter_str)
print(self.model.lastError())
print(s,type(s))
# end::filter[]



app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

此代码给我错误消息:<PySide6.QtSql.QSqlError("-3010", "QODBC: Unable to execute statement", "[Microsoft][ODBC-Treiber für Microsoft Access] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.") at 0x0000016FC7535108>

意思是:";期望1个参数,但传递的参数太少";

MS Access需要一个双撇号,如:

def update_filter(self, s):
s = re.sub(r"[W_]+", "", s)
filter_str = f"Produkt '%{s}%'"
self.model.setFilter(filter_str)```

最新更新