我创建了一个将管理连接和命令的类,我将其命名为 DbConfiguration ,并使用Singleton模式(使用dbc
作为对象名称)。
我的问题是当我尝试运行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\")
检索最后一个ID
,但它返回inventory
的所有字段,并将其全部写在可以写入的字段中,但是在我的C#代码中如果我在MS Access 2010上编写查询,它就不会对C#代码执行任何操作。什么似乎是问题?
更新2
dbc.GetCommand().Parameters.Clear()
答案 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);");