Domanda

Ho una collezione

List<Employee> employees;

Io uso un DataTable, e caricare tutti i record (da tavolo MDB) quando Form1.Loads, e aggiungi questi record a elenco (Collection) così io lavoro con loro in memoria.

Ora, quando aggiungo un nuovo dipendente alla raccolta, devo aggiungere che anche la tabella di mdb ... così mi fare:

DataRow rowemployee = Program.tblEmployee.NewRow();
rowemployee["name"] = tb_Name.Text;
rowemployee["address"] = tb_Address.Text;
//...all the other fields
Program.tblEmployee.AddRow(rowemployee);

L'IDE genera un errore per quanto riguarda colonna "id" non deve avere un valore nullo o non deve essere vuoto.
Come risulta dalla tabella MDB ha una colonna id, numero del tipo, AutoInc, come dovrei risolvere la classe Employee, ed i metodi / Collezioni DataTable, in modo che la colonna id viene "ignorato" quando si aggiungono nuove righe

Grazie

È stato utile?

Soluzione

Il primo problema è che, mentre la colonna id è auto-incrementato nel database, l'oggetto DataColumn ad esso corrispondente nel vostro DataTable non è impostato fino a incremento automatico. È necessario impostare i suoi AutoIncrement, AutoIncrementSeed, e le proprietà AutoIncrementStep.

Una volta fatto questo, si incorrerà nel secondo problema, che è di avere due diversi semi di incremento automatico: quello nel database e quello di tuo DataTable. Anche se quei due semi iniziano allo stesso valore, è banale per loro di ottenere fuori sincrono: aggiungere una riga al vostro DataTable e una diversa riga alla tabella del database, e ora avete due file differenti con lo stesso ID <. / p>

Questo è un problema comune, e la sua soluzione comune è quella di avere una differente sequenza di numerazione per le righe che vengono aggiunti al DataTable. Comunemente questo è fatto impostando il seme a 0 e il passo a -1, in modo che tutte le righe che si aggiungono alla DataTable dispongono di ID che sono meno di 0. (Questo naturalmente presuppone che tutti gli ID nel database sono maggiore di 0.) Questo significa che non c'è alcuna possibilità di una collisione ID tra le file aggiunti nel database e le righe aggiunte al DataTable.

Poi, quando effettivamente aggiorna il database dal DataTable, dopo aver inserito la riga nel database e il suo reale ID viene assegnato, si modifica l'ID nel DataRow al valore corretto. Se la riga partecipa nelle relazioni di dati come un genitore, il DataColumn deve avere gli aggiornamenti a catena insieme, in modo che cambiando l'ID nella riga padre dal suo valore locale temporanea al suo valore permanente cambia anche gli ID nelle relative righe figlio.

Una delle molte ragioni per usare set di dati digitati e adattatori da tavolo è che tutto questo lavoro è fatto per voi automaticamente. Ma se non si sta usando adattatori da tavolo, dovrete farlo da soli. C'è un buon esempio di questo nel la documentazione ADO

Altri suggerimenti

Come avete impostato la tavola?

Questo codice è dalla pagina DataRow.ItemArray proprietà MSDN che illustra come la proprietà AutoIncrement viene utilizzata.

private DataTable MakeTableWithAutoIncrement()
{
    // Make a table with one AutoIncrement column.
    DataTable table = new DataTable("table");
    DataColumn idColumn = new DataColumn("id", 
        Type.GetType("System.Int32"));
    idColumn.AutoIncrement = true;
    idColumn.AutoIncrementSeed = 10;
    table.Columns.Add(idColumn);

    DataColumn firstNameColumn = new DataColumn("Item", 
        Type.GetType("System.String"));
    table.Columns.Add(firstNameColumn);
    return table;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top