接続とコマンドを管理するクラスを作成しました。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()
訂正してくれてありがとう。問題のアクセスが 'VALUES'の中で' SELECT'を理解できないことがわかりました。最後に挿入されたIDを取得する方法はありますか? – ltlynx
私は 'DMax(\" [ID] \ "、\" inventory \ ")'を使用しましたが、 'inventory'のすべてのフィールドを返し、書き込むことができるフィールドにC#コードで書きますMS Access 2010でクエリを記述すると、C#コードで実行される処理は実行されません。問題であると想定されるのは? – ltlynx