【问题标题】:Oledb Insert statement using parameters使用参数的 Oledb 插入语句
【发布时间】:2018-10-07 10:05:07
【问题描述】:

如何使用 OleDB 从不同的表中插入参数?

我有 3 张桌子: 1. itemTbl 2. crateTbl 3.内容表

itemTbl 有:itemID、itemName、itemDesc crateTbl 有:crateID、crateName contentTbl 有:crateID、itemID、数量

contentTbl 是 crate 的内容和每个的数量

我需要它来选择我使用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;

【问题讨论】:

  • 我注意到的第一件事是您的列列表末尾有一个额外的逗号。第二件事是OLEDB doesn't let me use VALUES((SELECT)) 并没有真正告诉我们太多。您收到错误消息吗?如果是这样,它是什么?您正在使用什么数据库?
  • 我正在编辑那个 xD 抱歉。我正在使用访问数据库。它说: System.Data.OleDb.OleDbException: '查询输入必须包含至少一个表或查询。'
  • 自从我上次使用 ms-access 以来已经很久了。您确定语法有效吗?您是否尝试将值硬编码到参数占位符中并直接在 access 中运行?

标签: c# ms-access oledb oledbcommand


【解决方案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 = ?

(参数顺序需要重新调整,但你可以弄清楚)。

【讨论】:

  • 我会试试这个 xD 它看起来像一个奇怪的三明治......非常感谢!现在可以了! :D
  • 如果您不喜欢当前的语法,我添加了另一种语法:)
  • 等等!它现在会插入,但 crateID 和 itemID 已切换 =__=
  • 我说你需要调整参数顺序...你用的是第一种还是第二种方案?
【解决方案2】:

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

cmd.Parameters.Addwithvalue("crateID", txtCrate.Text)

【讨论】:

  • 这就是我做本地数据库代码的方式,但它在访问中不起作用:/
【解决方案3】:

我已经尝试过这个并且它有点工作,但由于某种原因,它只适用于项目表的值作为 ID。如果我有一个 crateTbl 具有但 itemTbl 没有的 ID(它们是整数),则它不会插入。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多