2 votes

Comment définir le champ primaire d'une table dans le design-time Firedac ?

Je souhaite faire d'un entier non nul et non automatique ma clé primaire, mais je ne parviens pas à le faire dans le temps de conception avec Firedac. Il n'y a pas de paramètre pour la fonction TIntegerfield qui me permet de le rendre primaire. Il n'y a pas non plus de paramètre du TFDTable où je peux choisir le champ primaire parmi tous les champs disponibles.

Je comprends qu'il soit possible de le faire en code et de le combiner avec ma table de conception, mais cela va à l'encontre de l'objectif de tout faire en conception.

Auparavant, j'avais un ID auto-inc dans ma table, et celui-ci était automatiquement défini comme clé primaire. J'ai supprimé ce champ car j'ai besoin d'un autre nombre entier comme clé primaire. De plus, je n'arrive pas à trouver d'informations sur la clé primaire&. TFDTable sur le site officiel de l'Embacadero.

2voto

MartynA Points 2084

Il est préférable d'expérimenter en utilisant une nouvelle table dans votre base de données et un nouveau projet Delphi minimal.

Mise à jour : Voir ci-dessous le DDL de la base de données et le DFM du formulaire.

Votre champ ID doit être considéré comme une clé primaire dans votre base de données.

Après avoir ajouté une FDConnection et une FDTable à votre projet, sélectionnez le Nom de la Table de la FDTable dans la liste déroulante. Cliquez ensuite dans le champ IndexName de la table FDTable et vous devriez trouver un index nommé automatiquement sur la clé primaire de la table. Il suffit de le sélectionner pour que l'IndexName prenne sa valeur. C'est tout ce qu'il y a à faire.

Pour la table créée à l'aide de la DDL ci-dessous, la propriété IndexName de la table FDTable se présente comme suit sqlite_autoindex_test_1

Si vous double-cliquez ensuite sur la FDTable et utilisez l'éditeur de champs pour configurer des champs persistants dans la FDTable, puis sélectionnez votre champ ID, vous devriez constater que si vous examinez ses ProviderFlags, ils devraient inclure les éléments suivants pfInKey qui indique à FireDAC d'utiliser le champ comme clé primaire de la table lorsqu'il génère le code SQL pour la mettre à jour, l'insérer, etc.

Vous devriez constater que le champ Requis du champ ID est automatiquement défini sur True, btw.

Si vous souhaitez fournir vous-même la valeur du champ ID lors de l'ajout d'un nouvel enregistrement, utilisez le champ OnNewRecord pour générer la valeur de l'ID et l'attribuer au champ.

DDL pour test Base de données Sqlite

create table test(
id int not null primary key,
AName nchar(12)
)

Extrait du projet DFM

object Form2: TForm2
  object DBGrid1: TDBGrid
    DataSource = DataSource1
  end
  object DBNavigator1: TDBNavigator
    DataSource = DataSource1
  end
  object FDConnection1: TFDConnection
    Params.Strings = (
      'Database=D:\aaad7\sqlite\MADB1.sqlite'
      'DriverID=SQLite')
    Connected = True
    LoginPrompt = False
  end
  object DataSource1: TDataSource
    DataSet = FDTable1
  end
  object FDTable1: TFDTable
    IndexName = 'sqlite_autoindex_test_1'
    Connection = FDConnection1
    UpdateOptions.UpdateTableName = 'test'
    TableName = 'test'
    object FDTable1id: TIntegerField
      FieldName = 'id'
      Origin = 'id'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object FDTable1AName: TWideStringField
      FieldName = 'AName'
      Origin = 'AName'
      FixedChar = True
      Size = 12
    end
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X