2016-04-28 44 views
2

我有一個包含5列(歌曲,藝術家,專輯,流派,時間)的數據表,該表允許我輸入儘可能多的行,因爲我想創建一個播放列表的音樂,當用戶認爲合適時,他們可以點擊按鈕導出數據訪問。我的訪問數據庫有一個名爲「播放列表」的表,其中有5列與數據表相同。當試圖傳輸數據時,我不斷收到Insert INTO語句的異常錯誤,我不知道爲什麼,因爲我正在使用commandBuilder。我附上了我的課程和方法,即執行此操作。將數據從DataTable傳輸到Access數據庫時插入INTO錯誤

請指教!

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的創作

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

數據表是如何創建的?如果您只是在代碼中構建一個代碼,那麼即使使用相同的名稱,適配器也不知道如何將數據保存到數據庫中。 – Plutonix

+0

我編輯了我的原始文章,我的dataTable正在創建。 – Imperiale

+0

需要從目標表創建DataTable。使用你的SELECT查詢。並使DataAdapter成爲表單/類級別的對象,以便保留INSERT,DELETE和UPDATE的智能。 [示例](http://stackoverflow.com/a/33702351/1070452) – Plutonix

回答

1

時間是一個保留字。出於某種原因,命令生成器不會將含有數據庫保留字(時間,日期,長度等)的字段括在括號[時間]中,這將允許插入查詢正常工作。如果沒有括號,插入將失敗,因爲SQL編譯器不知道字符串時間是否是sql命令或字段名稱。我發現的唯一解決方案是重命名數據庫字段,以便它們不與數據庫保留名稱發生衝突。希望MS最終能夠解決這個錯誤。