2012-04-12 23 views

回答

2

你需要得到QSqlField值模型,这是由

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

给出,那么你就可以检查是否字段可以为null,与QSqlField::requiredStatus()的每一列(如果驱动程序支持查询该属性)并获取其数据类型QSqlField::type()

2

从上面的alexisdm的回答中,我写了这个简单的代码片段来输出表中每个字段的属性。张贴在这里为任何有兴趣的人节省打字。

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

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(); 
    }