在C#(OLEDB)中一次将数据插入多个访问表

时间:2012-03-23 02:40:40

标签: c#-4.0 oledb ms-access-2010 insert-into ms-access

我创建了一个将管理连接和命令的类,我将其命名为 DbConfiguration ,并使用Singleton模式(使用dbc作为对象名称)。

我的问题是当我尝试运行ExecuteNonQuery()

时,这个SQL语法会抛出错误

使用此连接字符串:

"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\")检索最后一个ID,但它返回inventory的所有字段,并将其全部写在可以写入的字段中,但是在我的C#代码中如果我在MS Access 2010上编写查询,它就不会对C#代码执行任何操作。什么似乎是问题?

更新2

dbc.GetCommand().Parameters.Clear()

解决了问题

1 个答案:

答案 0 :(得分: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);");