如何使用OleDB从不同的表中插入参数?
我有3张桌子: 1. itemTbl 2. crateTbl 3. contentTbl
itemTbl具有:itemID,itemName,itemDesc crateTbl具有:crateID,crateName contentTbl具有:crateID,itemID,数量
contentTbl是板条箱的内容和每个板条的数量
我需要它来选择我使用WHERE
的不同表中的值。我已经使用本地数据库和基于服务的数据库尝试了类似的代码,它们允许我使用,但是OleDB不允许我使用VALUES((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;
答案 0 :(得分:1)
该错误消息具有很强的描述性。在没有主查询的情况下,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 = ?
(参数顺序需要再次调整,但您可以弄清楚)
答案 1 :(得分:0)
我不确定语法。我总是像使用它(这是从VB来的,但是C#应该是类似的):
cmd.Parameters.Addwithvalue(“ crateID”,txtCrate.Text)
答案 2 :(得分:0)
我已经尝试过这种方法,并且可以工作,但是由于某些原因,只能将项目表的值用作ID。如果我有crateTbl拥有的ID(它们是整数),但itemTbl没有,则不会插入。
cmd.Dispose();
cmd.CommandText = @"INSERT INTO contentTbl(itemID,crateID,qty) SELECT itemTbl.itemID,(SELECT crateTbl.crateID FROM crateTbl WHERE crateTbl.crateID = ?), ? FROM itemTbl WHERE itemTbl.itemID=?";
cmd.Connection = con;
cmd.Parameters.Add(new OleDbParameter("itemID", txtItem.Text));
cmd.Parameters.Add(new OleDbParameter("qty", txtQty.Text));
cmd.Parameters.Add(new OleDbParameter("crateID", txtCrate.Text));
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("Done!");
dt2.Clear();