C# .NET4.0 TableAdapter.Update() nu va insera o înregistrare nouă

Am o aplicație mică care constă dintr-un DAL, BLL și aplicația în sine, toate în proiecte diferite sub o singură soluție în Visual Studio 2010.

DAL-ul meu folosește un fișier xsd pentru a interoga baza de date, iar BLL-ul meu are metode de a obține informațiile de la DAL și de a face lucruri cu el.

În prezent, încerc să inserez o înregistrare utilizând codul din spatele aplicației pentru a efectua un apel la o metodă din BLL care apoi încearcă să inseze înregistrarea utilizând metoda Tableadapter.Update() generată în fișierul xsd al DAL.

Pot deja să selectez și să actualizez înregistrările fără probleme, dar nu pot introduce înregistrări.

Din câte știu, metoda TableAdapter.Update() ar trebui să știe să insereze o înregistrare nouă dacă îi ofer un rând nou, totuși returnează o valoare de 0 - ceea ce înseamnă că au fost afectate 0 rânduri, deci nu funcționează.

Tabelul în care încerc să îl inserez se numește tblRoles.

Are o coloană „ID”, care este o coloană int, cheie primară și identitate. Are o coloană „Nume” care ia nvarchar(50) și are 4 coloane „CanAdduser” etc. care iau un tip de bit.

Iată codul meu:

Codul APP din spatele:

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

Din câte am înțeles, ar trebui să insereze un nou rând în tabel, dar adapter.Update(row) continuă să returneze un 0 și nu știu de ce.

Când depanez, pot vedea că tuturor coloanelor de rând li s-au atribuit valorile corecte și că nu sunt generate erori.

Orice ajutor ar fi apreciat!

Editare:

Am uitat să menționez că atunci când am configurat interogarea implicită Fill, GetData() în fișierul xsd, m-am asigurat că generează automat instrucțiunile Insert, Update și Delete.


person Lucas    schedule 17.07.2011    source sursă


Răspunsuri (1)


Nu ați adăugat noul Role-Row la 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; asta are mai mult sens decât răspunsul meu. Se pare că alte exemple (un singur tabel?) nu numesc AcceptChanges. - person Merlyn Morgan-Graham; 18.07.2011
comment
Sclipitor! M-ai scutit de multe frustrari :) Multumesc! Sincer să fiu, nu eram sigur cum a funcționat totul, așa că nici măcar nu știam că metoda Add~Row() chiar exista. - person Lucas; 18.07.2011
comment
@Merlyn: adapter.Update va suna implicit AcceptChanges. msdn.microsoft.com/en-us/ bibliotecă/ - person Tim Schmelter; 18.07.2011