本文介绍了使用参数的Oledb INSERT语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何使用OleDB从不同的表插入参数?
我有3个表: 1.itemTbl 2.板条板 3.ContentTbl
ItemTbl有:itemID,itemName,itemDesc CrateTbl有:crateID,crateName ContentTbl有:crateID,ItemID,QutyContTbl是板条箱的内容和每个
的数量我需要它来选择我使用的不同表中的值WHERE
。我尝试了使用本地数据库和基于服务的数据库的类似代码,他们允许我使用,但OleDB不允许我使用值((SELECT))...
错误消息:
System.Data.OleDb.OleDbException:‘查询输入必须至少包含一个表或查询。
我的代码:
cmd.Dispose();
cmd.CommandText = @"INSERT INTO contentTbl(crateID,itemID,qty) VALUES((SELECT crateTbl.crateID FROM crateTbl WHERE crateTbl.crateID=?),(SELECT itemTbl.itemID FROM itemTbl WHERE itemTbl.itemID = ?), ?)";
cmd.Connection = con;
cmd.Parameters.Add(new OleDbParameter("crateID", txtCrate.Text));
cmd.Parameters.Add(new OleDbParameter("itemID", txtItem.Text));
cmd.Parameters.Add(new OleDbParameter("qty", txtQty.Text));
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("Done!");
da.SelectCommand = new OleDbCommand("SELECT * FROM contentTbl", con);
da.Fill(dt);
dgvContent.DataSource = dt;
推荐答案
该错误消息非常具有描述性。Access不支持没有主查询的子查询,因此请更改语法循环以使用其中一个子查询作为主查询:
INSERT INTO contentTbl(crateID,itemID,qty)
SELECT crateTbl.crateID,(SELECT itemTbl.itemID FROM itemTbl WHERE itemTbl.itemID = ?), ?
FROM crateTbl WHERE crateTbl.crateID=?
请注意,参数是按位置传递的,重写此查询确实需要对参数重新排序:
cmd.Parameters.Add(new OleDbParameter("itemID", txtItem.Text));
cmd.Parameters.Add(new OleDbParameter("qty", txtQty.Text));
cmd.Parameters.Add(new OleDbParameter("crateID", txtCrate.Text));
如果您不喜欢主查询/子查询语法,也可以使用交叉连接:
INSERT INTO contentTbl(crateID,itemID,qty)
SELECT crateTbl.crateID, itemTbl.itemID, ?
FROM crateTbl,itemTbl
WHERE crateTbl.crateID=? AND itemTbl.itemID = ?
(参数顺序需要重新调整,但您可以弄清楚)。
这篇关于使用参数的Oledb INSERT语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!