C# 使用参数的Oledb Insert语句

C# 使用参数的Oledb Insert语句,c#,ms-access,oledb,oledbcommand,C#,Ms Access,Oledb,Oledbcommand,如何使用OleDB将参数插入不同表中 我有三张桌子: 1.项目TBL 2.板条箱 3.内容 itemTbl有:itemID、itemName、itemDesc 板条箱具有:板条箱ID、板条箱名称 contentTbl有:板条箱ID、项目ID、数量 contentTbl是板条箱的内容物和每个板条箱的数量 我需要它在我使用的不同表中选择值。我尝试过使用本地数据库和基于服务的数据库的类似代码,它们允许我使用,但OleDB不允许我使用值SELECT 错误消息: System.Data.OleDb.OLE

如何使用OleDB将参数插入不同表中

我有三张桌子: 1.项目TBL 2.板条箱 3.内容

itemTbl有:itemID、itemName、itemDesc 板条箱具有:板条箱ID、板条箱名称 contentTbl有:板条箱ID、项目ID、数量

contentTbl是板条箱的内容物和每个板条箱的数量

我需要它在我使用的不同表中选择值。我尝试过使用本地数据库和基于服务的数据库的类似代码,它们允许我使用,但OleDB不允许我使用值SELECT

错误消息:

System.Data.OleDb.OLEDBEException:“查询输入必须至少包含一个表或查询

我的代码:

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 = ?

需要再次调整参数顺序,但您可以找到答案。

我不确定语法。我总是这样使用它,这是来自VB,但C应该是类似的:


cmd.Parameters.AddwithvaluecrateID,txtCrate.Text

我尝试过这一方法,但由于某些原因,它只能将items表的值作为ID使用。如果我有一个ID,它们是CLARTETBL有但itemTbl没有的INT,它不会插入

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();

我注意到的第一件事是在列列表的末尾有一个额外的逗号。第二件事是OLEDB不允许我使用值SELECT并没有告诉我们太多。你收到错误信息了吗?如果是,是什么?你在用什么数据库?我在编辑那个xD抱歉。我正在使用access数据库。上面写着:System.Data.OleDb.OLEDBEException:“查询输入必须至少包含一个表或查询。”。您确定语法有效吗?您是否尝试将值硬编码到参数占位符中并直接在access中运行它?这是我如何编写本地db代码的,但在access中不起作用:/我将尝试xD,它看起来像一个奇怪的三明治。。。非常感谢你!现在可以了!:如果您不喜欢当前的语法,我已经添加了另一种语法:等等!它现在将插入,但是crateID和itemID被切换了=\uIu=我说您需要调整参数顺序。。。您使用的是第一种解决方案还是第二种解决方案?