C# .NET4.0 TableAdapter.Update() n'insérera pas de nouvel enregistrement

J'ai une petite application composée d'un DAL, d'un BLL et de l'application elle-même, le tout dans différents projets sous une seule solution dans Visual Studio 2010.

Mon DAL utilise un fichier XSD pour interroger la base de données et mon BLL dispose de méthodes pour obtenir les informations du DAL et en faire des choses avec.

Actuellement, j'essaie d'insérer un enregistrement en utilisant le code derrière l'application pour appeler une méthode dans le BLL qui tente ensuite d'insérer l'enregistrement en utilisant la méthode Tableadapter.Update() générée dans le fichier xsd du DAL.

Je peux déjà sélectionner et mettre à jour des enregistrements sans problème, mais je ne peux pas insérer d'enregistrements.

Pour autant que je sache, la méthode TableAdapter.Update() devrait savoir insérer un nouvel enregistrement si je lui fournis une nouvelle ligne, mais elle renvoie une valeur de 0, ce qui signifie que 0 ligne a été affectée, donc cela ne fonctionne pas.

Le tableau dans lequel j'essaie d'insérer s'appelle tblRoles.

Il comporte une colonne « ID », qui est une colonne int, clé primaire et identité. Il a une colonne « Nom » qui prend nvarchar (50), et il a 4 colonnes « CanAdduser », etc. qui prennent un type de bit.

Voici mon code :

Code de l'application derrière :

protected void CreateRole(object sender, EventArgs e) {
    RolesBL roles = new RolesBL();

    roles.CreateRole(NewRoleName.Text);

    RolesGridView.DataBind();
}

BLL :

private tblRolesTableAdapter adapter = new tblRolesTableAdapter();

public bool CreateRole(string Name) {
    CMSDS.tblRolesDataTable roles = new CMSDS.tblRolesDataTable();
    CMSDS.tblRolesRow row = roles.NewtblRolesRow();

    row.Name = Name;
    row.CanAddUsers = false;
    row.CanEditUsers = false;
    row.CanSuspendUsers = false;
    row.CanChangeUserPasswords = false;

    int result = adapter.Update(row);

    if(result == 1) {
        return true;
    }

    return false;
}

D'après ce que j'ai compris, cela devrait insérer une nouvelle ligne dans le tableau, mais adapter.Update(row) continue de renvoyer un 0 et je ne sais pas pourquoi.

Lorsque je débogue, je peux voir que toutes les colonnes de lignes ont reçu les valeurs correctes et qu'aucune erreur n'est générée.

Toute aide serait appréciée!

Modifier :

J'ai oublié de mentionner que lorsque j'ai configuré la requête Fill,GetData() par défaut dans le fichier xsd, je me suis assuré qu'elle générait automatiquement les instructions Insert, Update et Delete.


person Lucas    schedule 17.07.2011    source source


Réponses (1)


Vous n'avez pas ajouté le nouveau Role-Row au DataTable.

CMSDS.tblRolesDataTable roles = new CMSDS.tblRolesDataTable();
CMSDS.tblRolesRow row = roles.NewtblRolesRow();
row.Name = Name;
roles.AddtblRolesRow(row); 
int result = adapter.Update(roles); //the same as `adapter.Update(row)`
person Tim Schmelter    schedule 17.07.2011
comment
+1 ; cela a plus de sens que ma réponse. Il semble que d'autres exemples (de table unique ?) n'appellent pas AcceptChanges. - person Merlyn Morgan-Graham; 18.07.2011
comment
Brillant! Vous m'avez évité bien des frustrations :) Merci ! Pour être honnête, je ne savais pas vraiment comment tout cela fonctionnait, donc je ne savais même pas que la méthode Add~Row() existait. - person Lucas; 18.07.2011
comment
@Merlyn : adapter.Update appellera implicitement AcceptChanges. msdn.microsoft.com/en-us/ bibliothèque/ - person Tim Schmelter; 18.07.2011