2012-03-23 21 views
1

接続とコマンドを管理するクラスを作成しました。DbConfigurationという名前のオブジェクトを使用します(オブジェクト名としてdbcを使用)。C#(OLEDB)で複数のアクセステーブルにデータを一度に挿入する

dbc.SetCommand("INSERT INTO inventory ([CallNumber], [Title], [ImageLocation]) VALUES (@CALLNUMBER, @TITLE, @IMAGELOC);"); 
dbc.GetCommand().Parameters.Add("@CALLNUMBER", System.Data.OleDb.OleDbType.VarChar, 255); 
dbc.GetCommand().Parameters.Add("@TITLE", System.Data.OleDb.OleDbType.VarChar, 255); 
dbc.GetCommand().Parameters.Add("@IMAGELOC", System.Data.OleDb.OleDbType.VarChar, 255); 

dbc.GetCommand().Parameters["@CALLNUMBER"].Value = txtCallNumber.Text; 
dbc.GetCommand().Parameters["@TITLE"].Value = txtTitle.Text; 
dbc.GetCommand().Parameters["@IMAGELOC"].Value = (!moveto.Equals("db_storage\\") ? moveto : "db_storage\\no_img.png"); 

と続く:私はこの最初に実行

"Provider=Microsoft.ACE.OLEDB.12.0;dbms.accdb;Persist Security Info=False" 

私の問題は、私は、この接続文字列を使用してExecuteNonQuery()

を実行しようとすると、このSQL構文はエラーをスローで:

dbc.GetCommand().ExecuteNonQuery(); 

次は、私はこのコードを実行されます。

dbc.SetCommand("INSERT INTO publishing_info ([ID], [Author], [DateTime], [Publisher], [Pages], [ISBN_NO]) " + 
       "VALUES (" + 
       "SELECT([ID] FROM inventory " + 
       "WHERE [email protected] AND [email protected] AND [email protected]), " + 
       "@AUTHOR, @DATETIME, @PUBLISHER, @PAGES, @ISBN);"); 

とも続く:

ここ
dbc.GetCommand().ExecuteNonQuery(); 

は、私はあなたの参照のために使用しているパラメータです:ここでは

dbc.GetCommand().Parameters.Add("@AUTHOR", System.Data.OleDb.OleDbType.VarChar, 255); 
dbc.GetCommand().Parameters.Add("@DATETIME", System.Data.OleDb.OleDbType.VarChar, 255); 
dbc.GetCommand().Parameters.Add("@PUBLISHER", System.Data.OleDb.OleDbType.VarChar, 255); 
dbc.GetCommand().Parameters.Add("@PAGES", System.Data.OleDb.OleDbType.UnsignedInt, 4); 
dbc.GetCommand().Parameters.Add("@ISBN", System.Data.OleDb.OleDbType.VarChar, 255); 

dbc.GetCommand().Parameters["@AUTHOR"].Value = txtAuthor.Text; 
dbc.GetCommand().Parameters["@DATETIME"].Value = txtYear.Text; 
dbc.GetCommand().Parameters["@PUBLISHER"].Value = txtPublisher.Text; 
dbc.GetCommand().Parameters["@PAGES"].Value = uint.Parse(txtPages.Text); 
dbc.GetCommand().Parameters["@ISBN"].Value = txtISBN.Text; 

です私のスタックトレースのスクリーンショット(私は1つのrepポイントしかないので、私はそれを添付できません) http://i44.tinypic.com/2w49t84.png

構文を有効にするにはどうすればよいですか? また、別のクエリを実行する前に最初に接続を閉じる必要がありますか?

アップデート1

私は最後IDを取得するためにDMax(\"[ID]\", \"inventory\")を使用しますが、それはinventoryのすべてのフィールドを返し、それが私のC#コードで、に書き込むことができるフィールドではなく、私が書く場合はそれをすべての書き込みを行いますMS Access 2010のクエリでは、C#コードで実行される処理は行われません。問題であると想定されるのは?

アップデート2

あなたは、接続を閉じる必要はありませんが、あなたはあなたのサブ選択に左括弧を挿入する必要がありますdbc.GetCommand().Parameters.Clear()

答えて

0

で解決される問題:

dbc.SetCommand("INSERT INTO publishing_info ([ID], [Author], [DateTime], [Publisher], [Pages], [ISBN_NO]) " + 
      "VALUES (" + 
      "(SELECT([ID] FROM inventory " + 
      "WHERE [email protected] AND [email protected] AND [email protected]), " + 
      "@AUTHOR, @DATETIME, @PUBLISHER, @PAGES, @ISBN);"); 
+0

訂正してくれてありがとう。問題のアクセスが 'VALUES'の中で' SELECT'を理解できないことがわかりました。最後に挿入されたIDを取得する方法はありますか? – ltlynx

+0

私は 'DMax(\" [ID] \ "、\" inventory \ ")'を使用しましたが、 'inventory'のすべてのフィールドを返し、書き込むことができるフィールドにC#コードで書きますMS Access 2010でクエリを記述すると、C#コードで実行される処理は実行されません。問題であると想定されるのは? – ltlynx

関連する問題