2016-04-28 6 views
2

私はテーブルに5つの列(Song、Artist、Album、Genre、Time)を持つデータテーブルを用意しています。ユーザーが適切と感じると、ボタンをクリックしてデータをエクスポートしてアクセスすることができます。私のアクセスデータベースには、データテーブルと同じ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

データテーブルはどのように作成されましたか?コード内で構築したばかりの場合、同じ名前を使用していても、アダプタはデータをDBに保存する方法を知りません。 – Plutonix

+0

自分のdataTableが作成されている元の投稿を編集しました。 – Imperiale

+0

宛先テーブルからDataTableを作成する必要があります。そのためにSELECTクエリを使用します。 DataAdapterをフォーム/クラスレベルのオブジェクトにして、INSERT、DELETE、およびUPDATEのスマートを保持するようにします。 [例](http://stackoverflow.com/a/33702351/1070452) – Plutonix

答えて

1

時間は予約語です。何らかの理由で、コマンドビルダは、データベース予約語(時間、日付、長さなど)であるフィールドを、大カッコ[時間]で囲みません。これにより、挿入クエリが正しく機能するようになります。角かっこなしでは、文字列timeがSQLコマンドまたはフィールド名であるかどうかをSQLコンパイラーが認識しないため、挿入が失敗します。私が見つけた唯一の解決策は、データベースの予約名と矛盾しないようにデータベースフィールドの名前を変更することです。うまくいけばMSは最終的にこのミスを修正します。

関連する問題