首页 > 解决方案 > PyQt5 Qsqltablemodel 数据类型“在等于运算符中不兼容”,数据超过 128 个字符

问题描述

我目前正在开发基于 PyQt5 的软件,该软件连接到 SQL 数据库,用于管理大量人员的作业。这些作业文档的 URL 很长,最多可达 260 个字符,我在尝试使用这些长链接编辑条目时遇到了一个错误。

QODBCResult::exec: 无法执行语句:“[Microsoft][ODBC SQL Server Driver][SQL Server]数据类型 nvarchar(max) 和 ntext 在等于运算符中不兼容。[Microsoft][ODBC SQL Server Driver] [SQL Server]无法准备语句。”

每当链接长度超过 128 个字符时,就会发生错误,所以我假设我遇到的某个地方有 16 个字节的限制,但我不知道在哪里。我尝试将 SQL 数据库中的数据类型更改为不同大小的 nvarchars、nchars 等。我还进行了测试,以确保它不会对链接做一些奇怪的事情,并使用纯文本。我什至尝试将其更改为 ntext,错误会说

...数据类型 ntext 和 ntext 在等于运算符中不兼容...

这是我的课程管理窗口的代码。我对 Qt 的东西比较陌生,基本上只是从随机论坛帖子中学习它以及我可以从文档中弄清楚,所以我可能有一些不好的做法。

import sys
import configparser
from PyQt5 import QtGui, QtCore, uic
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox, QTableView, QLabel, QItemDelegate
from PyQt5.QtSql import QSqlTableModel, QSqlDatabase
from PyQt5.QtCore import QVariant, Qt
from views.ui_coursesTable import Ui_Table

class ManageCoursesWindow(QWidget, Ui_Table):
    def __init__(self, db):
        super(ManageCoursesWindow, self).__init__()

        self.config = configparser.ConfigParser()
        self.config.read('config.ini')
        
        self.areEdits=False
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.ui = Ui_Table()
        self.ui.setupUi(self)
        
        self.db = db
        self.db.setDatabaseName(self.config.get('Database', 'conn_string'))
        self.db.open()
        self.model = QSqlTableModel()
        self.initializedModel()
        self.ui.tableView.setModel(self.model)
        self.ui.tableView.setColumnWidth(1,235)
        self.ui.tableView.setColumnWidth(2,100)
        self.ui.tableView.setColumnWidth(9,85)
        self.setWindowTitle("Manage Courses")

        self.ui.addRow.clicked.connect(self.onAddRow)
        self.ui.deleteRow.clicked.connect(self.onDeleteRow)
        self.ui.submitAll.clicked.connect(self.onSave)
        self.ui.filterButton.clicked.connect(self.onFilter)

    def initializedModel(self):
        self.model.setTable("tbl_courses")
        self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.model.select()

    def onAddRow(self):
        self.model.insertRows(self.model.rowCount(), 1)
        self.areEdits=True

    def onDeleteRow(self):
        self.model.removeRow(self.ui.tableView.currentIndex().row())
        self.areEdits=True

    def onSave(self):
        self.areEdits=False
        self.model.submitAll()

    def maybeSave (self):
        if self.areEdits:
            if QMessageBox.question(self, 'Save?', "Quit without saving?", QMessageBox.Yes | QMessageBox.No)==QMessageBox.Yes:
                return True
            else:
                return False
        else:
            return True

    def closeEvent(self, event):\
        if maybeSave:
            self.db.close()
            event.accept()

    def onFilter(self):
        course = self.ui.filterField.text().strip()
        self.model.setFilter('')
        self.model.setFilter("Course_Number LIKE '%"+course+"%' OR Course_Title LIKE '%"+course+"%'")
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("Fusion")

    window = ManageCoursesWindow(QSqlDatabase.addDatabase("QODBC"))
    window.show()
    sys.exit(app.exec_())

该软件过去是从 SQLITE 数据库运行的,但几个月前临时帮助该软件的另一个人将其更改为使用完整的 SQL 数据库。我不记得当时存在这个错误,尽管我们可能当时没有碰巧使用任何 >128 个字符的链接

标签: pythonsqlqtpyqt5qsqltablemodel

解决方案


推荐阅读