Я создал класс, который будет управлять подключением и командами, я назвал его 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);");
, а также: 1021 *
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\")
для получения последнего ID
, но он возвращает все поля inventory
и записывает все это в поля, в которые он может быть записан, в моем коде C #, но если я пишу запрос на MS Access 2010 не делает то, что делает с кодом C #. В чем проблема?
Обновление 2
Проблема решена с помощью dbc.GetCommand().Parameters.Clear()