python - 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 个字符的链接
解决方案
推荐阅读
- python - 在 Python 中并排显示图形卡
- ssh - 具有 SSH 连接的 Airflow DAG 无法按计划同时开始运行
- python - 将接受多个参数的函数作为参数传递给函数
- php - 那是哪种类型的数组?我需要在 php 中阅读这个
- reactjs - 如何实现 Storybook + Custom Block (Gutenberg)?
- python - 如何根据单词组合句子
- cross-compiling - 使用 Buildroot 工具链交叉编译 V8
- javascript - 出现错误未捕获的 ReferenceError:未定义 firebase
- python - 使用 asyncio 触发并忘记发布请求
- gridview - Liferay网格结构,制作等宽行