Oledb使用参数的插入语句

时间:2018-10-07 10:05:08

标签: c# ms-access oledb oledbcommand

如何使用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;

3 个答案:

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