2016-09-01 6 views
2

ich eine Tabelle wie dies in meinem Access-Datenbank habenEinfügen beliebige Werte in Autofeld über OleDbDataAdapter.Update

id name address  date 
1 first addresss 5/6/2005 9:17:52 AM 
2 test1 address1 5/11/2005 5:23:32 AM 
3 test22 address2 5/11/2006 5:23:32 AM 
8 test3 address3 5/11/2007 5:23:32 AM 
9 test4 address4 5/11/2008 5:23:32 AM 
13 test address  5/11/2008 5:23:32 AM 

Hier eingereicht id ist ein Primary Key-AutoNumber Feld. Nun, wie kann ich einen Datensatz mit einer ID in diese Tabelle mit C# einfügen?

Wenn ich Insertionen mit ID unter 13 oder über 14 versuche, wird der nächste eingefügte Wert 14 sein. Was passiert, wenn ich einen gelöschten Datensatz wieder in die Tabelle einfügen möchte?

Alle Problemumgehungen oder tatsächlichen Lösungen, die dieses Problem angehen, werden geschätzt.

Edit 1:

Es ist gut zu hören, dass ihre möglich einzufügen, Werte in ein AutoNumber Feld. Hier ist die Funktion, die ich zum Einfügen von Massen verwende. Die DataTable hat die gleichen Spaltennamen mit ähnlichen Datentypen. Der Code funktioniert aber wie gesagt, die Primärschlüssel werden automatisch vergeben.

Könnte es irgendeine Art von Fix für diesen bestimmten Code geben?

public void AccessBulkCopy(DataTable table) 
{ 
    foreach (DataRow r in table.Rows) 
     r.SetAdded(); 

    var myAdapter = new OleDbDataAdapter("SELECT * FROM " + table.TableName, _myAccessConn); 

    var cbr = new OleDbCommandBuilder(myAdapter); 
    cbr.QuotePrefix = "["; 
    cbr.QuoteSuffix = "]"; 
    cbr.GetInsertCommand(true); 

    myAdapter.Update(table); 
} 
+0

zeigen Sie den Code Sie einen Wert von 11 in der Tabelle einzufügen verwendet – Steve

+5

In MS Access, können Sie eine INSERT INTO Rene

Antwort

2

Die Access-Datenbank-Engine tut tatsächlich erlauben uns, SQL zu verwenden, um beliebige Werte in ein AutoNumber-Feld einzufügen. Im Folgenden wird in Ihrem Fall arbeiten, sofern nicht bereits eine Zeile in der Tabelle mit [id] ist = 11:

string sql = "INSERT INTO [YourTable] ([id], [name]) VALUES (?,?)"; 
using (var cmd = new OdbcCommand(sql, conn)) 
{ 
    cmd.Parameters.AddWithValue("?", 11); 
    cmd.Parameters.AddWithValue("?", "Gord"); 
    cmd.ExecuteNonQuery(); 
} 

bearbeiten

Mit Ihrem OleDbDataAdapter, die InsertCommand, dass wird automatisch generiert, indem OleDbCommandBuilder erkennt, dass [ID] eine AutoNumber-Spalte ist und es aus dem CommandText ("INSERT INTO ...") wegläßt. Also wurde die "id" -Spalte in Ihrem DataTable ignoriert und Sie erhielten automatisch zugewiesene [id] -Werte.

Wenn Sie die [id] Spalte in der INSERT enthalten wollen, dann müssen Sie Ihre eigene OleDbDataAdapter.InsertCommand erstellen, wie so:

using (var da = new OleDbDataAdapter("SELECT [id], [name] FROM [YourTable] WHERE 1=0", conn)) 
{ 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 

    var cmd = new OleDbCommand("INSERT INTO [YourTable] ([id], [name]) VALUES (?,?)", conn); 
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Integer, 0, "id")); 
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarWChar, 255, "name")); 
    da.InsertCommand = cmd; 

    DataRow dr = dt.NewRow(); 
    dr["id"] = 11; 
    dr["name"] = "Gord"; 
    dt.Rows.Add(dr); 
    da.Update(dt); 
} 
+0

Glaubst du, dass der Grund, warum mein Code so funktioniert, etwas mit dem Datenbankverbindungstyp zu tun hat? Ich sehe, dass Sie Odbc Verbindung verwenden, während mein Code OleDb verwendet. – 0014

+1

Nein, Odbc und OleDb sind in dieser Hinsicht ähnlich. Der Unterschied war, dass Sie einen OleDbCommandBuilder verwendeten. Ich habe meine Antwort aktualisiert. –

0

Sie sollten nicht. Ein Auto-Nummer, Primärschlüsselfeld in MS Access sollte nie bearbeitet oder geändert werden. Selbst wenn du einen Hack findest, ist es eine schlechte Übung. Einige SQL-Datenbanken haben Problemumgehungen, die dies zulassen.

In der Regel werden wir nie aus der Tabelle löschen. Stattdessen haben Sie ein Feld, vielleicht ein Textfeld, vielleicht ein einzelnes Zeichen, das A für Aktiv oder D für gelöscht anzeigt.

Dann richten Sie eine Ansicht (eine Abfrage), die alle Felder zurückgibt, aber nur die aktiven Zeilen. Sie können dann alle Ihre Berichte, Formulare, Abfragen, arbeiten, für diese Ansicht.

Wenn Sie eine gelöschte Zeile zurück einfügen müssen, haben Sie ein spezielles Update, das den gelöschten Status wieder in active ändert.

+0

Nun, alles korrekt, aber was richtig ist, ist nicht immer wahr. MS-Access ist nicht die einzige Datenbank, die ein direktes Einfügen in ein Auto-Nummernfeld erlaubt. Ihr _you can__ sollte zu _you solltenit_ – Steve

+0

@ steve geändert werden Ich glaube, daß Access Ihnen nicht erlauben wird, ein Autozahlfeld zu aktualisieren. Willst du sagen, dass andere Datenbanken dies zulassen? Ich habe meine Antwort geändert, um deutlicher zu machen, dass ich gerade über Access gesprochen habe. – Knox

+1

Für MS-Access können Sie einen INSERT INTO eingeben und die Spalteneinstellung AUTONUMBER für den von Ihnen gewünschten Wert angeben. Da es sich bei der AUTONUMBER-Spalte auch um einen Primärschlüssel handelt, können Sie keinen vorhandenen Wert einfügen. Leider können Sie eine höhere als die zuletzt gespeicherte Zahl einfügen, und der Fehler tritt auf, wenn die Autoinkrementierungsnummer den manuell eingegebenen Wert erreicht (Happened). MySql erlaubt Ihnen auch, den manuellen Wert anzugeben, aber es handhabt die nächste generierte ID korrekt (oder erlaubt zumindest nicht das Einfügen einer höheren Nummer - im Moment nicht sicher), für SQL SERVER rufen Sie nur IDENTITY_INSERT ON und OFF – Steve