3

の各列のプロパティと制約を確認する方法はありますQSqlRelationalTableModelか? QSqlRelationalTableModelたとえば、特定の列に null を含めることができるかどうか、またはその列で有効なデータ型をオブジェクトに尋ねたいとします。

4

2 に答える 2

2

上記の alexisdm の回答から、この単純なコード スニペットを作成して、テーブル内の各フィールドのプロパティを出力しました。ここに投稿して、興味のある他の人のために入力を節約します。

また、落とし穴も発見しました。たとえば、データベースで自動インクリメント フィールドとして指定されたフィールドであっても、いくつかのプロパティを使用しtable_model::record()たり、table_model::record(int)(私にとって) 予期しない結果が得られたりすると、常に false が返されるようです。isAutoValueただし、実際の値は得られますがtypeID()(typeID() が何であるかは特定できませんでした)、typeID()を使用すると常に -1 が返されます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 に答える
2

モデルの各列の値を取得する必要があります。QSqlFieldこれは次の式で与えられます。

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

QSqlField::requiredStatus()次に、 (ドライバーがそのプロパティのクエリをサポートしている場合) を使用してフィールドが null になるかどうかを確認し、 を使用してそのデータ型を取得できますQSqlField::type()

于 2012-04-12T23:52:26.910 に答える