接続とコマンドを管理するクラスを作成しました。DbConfigurationという名前を付け、Singleton パターン (dbc
オブジェクト名として使用) を使用します。
私の問題は、実行しようとするとこのSQL構文がエラーをスローすることですExecuteNonQuery()
この接続文字列の使用:
"Provider=Microsoft.ACE.OLEDB.12.0;dbms.accdb;Persist Security Info=False"
私はこれを最初に実行しました:
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");
続いて:
dbc.GetCommand().ExecuteNonQuery();
次に、このコードを実行しました:
dbc.SetCommand("INSERT INTO publishing_info ([ID], [Author], [DateTime], [Publisher], [Pages], [ISBN_NO]) " +
"VALUES (" +
"SELECT([ID] FROM inventory " +
"WHERE inventory.CallNumber=@CALLNUMBER AND inventory.Title=@TITLE AND inventory.ImageLocation=@IMAGELOC), " +
"@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つしかないため添付できません) http://i44.tinypic.com/2w49t84.png
構文を機能させるにはどうすればよいですか? また、別のクエリを実行する前に、最初に接続を閉じる必要がありますか?
更新 1
以前DMax(\"[ID]\", \"inventory\")
は最後のものを取得していましたが、C#コードID
ですべてのフィールドを返しinventory
、書き込み可能なフィールドにすべて書き込みますが、MS Access 2010でクエリを作成すると、クエリが実行されませんC# コード。問題に見えるのは?
更新 2
で解決した問題dbc.GetCommand().Parameters.Clear()