Вставка данных в несколько таблиц доступа одновременно в C # (OLEDB) - PullRequest
1 голос
/ 23 марта 2012

Я создал класс, который будет управлять подключением и командами, я назвал его 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()

1 Ответ

0 голосов
/ 23 марта 2012

Вам не нужно закрывать соединение, но вам нужно вставить левую скобку в ваш дополнительный выбор:

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);");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...