2016-04-28 16 views
2

Ich habe eine Datentabelle mit 5 Spalten, (Song, Interpret, Album, Genre, Zeit) die Tabelle ermöglicht mir so viele Zeilen wie ich eine Playlist erstellen möchten Wenn der Benutzer es für richtig hält, kann er auf die Schaltfläche klicken und die Daten für den Zugriff exportieren. Meine Access-Datenbank hat eine Tabelle namens "Playlist" mit den gleichen 5 Spalten wie die Datentabelle. Wenn ich versuche, die Daten zu übertragen, bekomme ich den Ausnahmefehler für die Insert INTO-Anweisung und ich habe keine Ahnung, warum, weil ich einen commandBuilder benutze. Ich habe meine Klasse und Methode angehängt, die diese Aktion durchführt.Einfügen INTO-Fehler beim Übertragen von Daten von DataTable auf Access-Datenbank

Bitte beraten!

public void ExportPlaylistToAccess(DataTable playlist) 

{ 

// open connection to the database pathed to 

String connection = @"Provider=Microsoft.ACE.OLEDB.12.0;" + 

@"Data source= D:\CIS 465\Final Project\VirtualiPod\iTunesPlaylistDatabase.accdb"; 

using (OleDbConnection con = new OleDbConnection(connection)) 

{ 

var adapter = new OleDbDataAdapter(); 

adapter.SelectCommand = new OleDbCommand("SELECT * from [Playlist]", con); 

var cbr = new OleDbCommandBuilder(adapter); 

cbr.GetDeleteCommand(); 

cbr.GetInsertCommand(); 

cbr.GetUpdateCommand(); 

try 

{ 

con.Open(); 

adapter.Update(playlist); 

} 

catch (OleDbException ex) 

{ 

MessageBox.Show(ex.Message, "Database Error"); 

} 

catch (Exception x) 

{ 

MessageBox.Show(x.Message, "Exception Error"); 

} 

} 

Datatable Schöpfung

private void createPlaylist_Click(object sender, EventArgs e) 

{ 

if (playlist.Rows.Count == 0) 

{ 

playlist.Columns.Add("Song"); 

playlist.Columns.Add("Artist"); 

playlist.Columns.Add("Album"); 

playlist.Columns.Add("Genre"); 

playlist.Columns.Add("Time"); 

dataGridView1.DataSource = playlist; 

} 

else if (playlist.Rows.Count > 0) 

{ 

MessageBox.Show("Please clear your current playlist to create a new one."); 

} 

} 

// adds song to playlist for user upon click 

private void addToPlaylist_Click(object sender, EventArgs e) 

{ 

IITTrackCollection tracks = app.LibraryPlaylist.Tracks; 

IITTrack currentTrack = app.CurrentTrack; 

DataRow newRow; 

newRow = playlist.NewRow(); 

newRow["Song"] = currentTrack.Name; 

newRow["Artist"] = currentTrack.Artist; 

newRow["Album"] = currentTrack.Album; 

newRow["Genre"] = currentTrack.Genre; 

newRow["Time"] = currentTrack.Time; 

playlist.Rows.Add(newRow); 

dataGridView1.DataSource = playlist; 

} 
+0

Wie wurde die Datentabelle erstellt? Wenn Sie nur einen im Code erstellt haben, weiß der Adapter nicht, wie er die Daten in der Datenbank speichern soll, obwohl Sie dieselben Namen verwendet haben. – Plutonix

+0

Ich habe meinen ursprünglichen Post bearbeitet, in dem meine dataTable erstellt wird. – Imperiale

+0

Die DataTable muss aus der Zieltabelle erstellt werden. Verwenden Sie Ihre SELECT-Abfrage dafür. Und machen Sie das DataAdapter zu einem Formular/Klasse-Level-Objekt, so dass es die Smart für INSERT, DELETE und UPDATE behält. [Beispiel] (http://stackoverflow.com/a/33702351/1070452) – Plutonix

Antwort

1

Zeit ist ein reserviertes Wort. Aus irgendeinem Grund umgibt der Befehlsgenerator Felder, die reservierte Datenbankwörter sind (Zeit, Datum, lange usw.), nicht mit Klammern [Zeit], die es der Einfügeabfrage erlauben würden, korrekt zu arbeiten. Ohne die Klammern wird der Einfügevorgang fehlschlagen, da der SQL-Compiler nicht weiß, ob die Zeichenfolgenzeit ein SQL-Befehl oder ein Feldname ist. Die einzige Lösung, die ich gefunden habe, besteht darin, Ihre Datenbankfelder umzubenennen, damit sie nicht in Konflikt mit den reservierten Namen der Datenbank stehen. Hoffentlich wird MS diesen Fehler beheben.