1

接続とコマンドを管理するクラスを作成しました。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()

4

1 に答える 1

0

接続を閉じる必要はありませんが、副選択に左括弧を挿入する必要があります。

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);");
于 2012-03-23T02:50:03.693 に答える