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);
}
zeigen Sie den Code Sie einen Wert von 11 in der Tabelle einzufügen verwendet – Steve
In MS Access, können Sie eine INSERT INTO
Antwort
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:
bearbeiten
Mit Ihrem
OleDbDataAdapter
, dieInsertCommand
, dass wird automatisch generiert, indemOleDbCommandBuilder
erkennt, dass [ID] eine AutoNumber-Spalte ist und es aus dem CommandText ("INSERT INTO ..."
) wegläßt. Also wurde die "id" -Spalte in IhremDataTable
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:
Quelle
2016-09-02 10:27:27
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
Nein, Odbc und OleDb sind in dieser Hinsicht ähnlich. Der Unterschied war, dass Sie einen OleDbCommandBuilder verwendeten. Ich habe meine Antwort aktualisiert. –
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.
Quelle
2016-09-01 22:27:56 Knox
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
@ 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
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
Verwandte Themen