3

有没有办法检查 a 中每一列的属性和约束QSqlRelationalTableModel?例如,我想询问我的QSqlRelationalTableModel对象某个列是否可以包含空值,或者该列有效的数据类型。

4

2 回答 2

2

您需要为QSqlField模型的每一列获取一个值,该值由下式给出

QSqlRecord record = model->database().record(model->tableName());
QSqlField field = record.field(columnIndex);

然后您将能够检查一个字段是否可以为空QSqlField::requiredStatus()(如果驱动程序支持查询该属性)并使用QSqlField::type().

于 2012-04-12T23:52:26.910 回答
2

根据上面 alexisdm 的回答,我编写了这个简单的代码片段来输出表中每个字段的属性。将其张贴在这里以节省其他有兴趣的人的打字。

我还发现了一个问题:如果您使用table_model::record()或者table_model::record(int)您对某些属性(对我而言)得到了意想不到的结果,例如,isAutoValue似乎总是返回 false,即使对于在数据库中指定为自动增量字段的字段也是如此。但是,您确实得到了一个真正的值typeID()(尽管我无法确定 typeID() 是什么),而typeID()使用model->database().record(model->tableName()).

  QSqlRecord record = table_model->database().record(table_model->tableName());
  // the following get isAutoValue() wrong; but have a real typeID()
  //QSqlRecord record = table_model->record();  
  //QSqlRecord record = table_model->record(table_model->rowCount() - 1);
  qDebug() << "********** table" << table_model->tableName() << "*********";
  for (int i = 0; i < table_model->columnCount(); ++i) {
    QSqlField field = record.field(i);
    qDebug() << "---------- field" << i << field.name() << "--------";
    qDebug() << "default value" << field.defaultValue();
    qDebug() << "is auto value" << field.isAutoValue();
    qDebug() << "is generated" << field.isGenerated();
    qDebug() << "is null" << field.isNull();
    qDebug() << "is read only" << field.isReadOnly();
    qDebug() << "is valid" << field.isValid();
    qDebug() << "length" << field.length();
    qDebug() << "precision" << field.precision();
    qDebug() << "required status" << field.requiredStatus();
    qDebug() << "type" << field.type();
    qDebug() << "type id" << field.typeID();
    qDebug() << "value" << field.value();
  }
于 2012-04-13T15:53:12.797 回答