【问题标题】:How can I filter an ms-access databse, using QSqlTableModel and QLineEdit?如何使用 QSqlTableModel 和 QLineEdit 在 ms-access 数据库中进行过滤?
【发布时间】:2021-08-14 04:05:11
【问题描述】:

我正在构建一个允许用户在 ms 访问数据库中搜索信息的 GUI (是的。它必须是 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:\scripts\python\pyside_Tutorials\databases\chinook.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 个参数,但传递的参数太少”

【问题讨论】:

  • 感谢@eyllanesc。我改变了TYPO。但错误仍然是一样的。正如我所提到的,我尝试了不同的方法来找到解决方案。这是来自特定 Pyside6-Book 的示例:'''filter_str = 'Name LIKE "%{}%"'.format(s)''' 但在示例中它是一个 QSqlite 数据库。我认为,差异对问题至关重要。
  • 错误不能完全一样,除了提供minimal reproducible example之外,显示新的错误信息
  • Produkt LIKE %{}%"Produkt LIKE "%{}%" 不同
  • <PySide6.QtSql.QSqlError("-3100", "QODBC: Unable to execute statement", "[Microsoft][ODBC-Treiber für Microsoft Access] Syntaxfehler in Abfrageausdruck 'Produkt LIKE %k%'.") at 0x000001C9F8613D08> @eyllanesc 你是对的。 \ 和 " 消失了。
  • 错字:使用filter_str = 'Produkt LIKE "%{}%"'.format(s)

标签: python sql ms-access pyside6 pyqt6


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多