Oledb Insert 语句使用参数
Oledb Insert statement using parameters
如何使用 OleDB 从不同的表中插入参数?
我有 3 个表:
1. itemTbl
2.crateTbl
3.内容表
itemTbl 具有:itemID、itemName、itemDesc
crateTbl 有:crateID,crateName
contentTbl 具有:crateID、itemID、数量
contentTbl 是箱子的内容和每个箱子的数量
我需要它 select 我使用的不同表格中的值 WHERE
。我已经使用本地数据库和基于服务的数据库尝试了类似的代码,它们允许我使用,但 OleDB 不允许我使用 VALUES((SELECT))...
错误信息:
System.Data.OleDb.OleDbException: 'Query input must contain at least one table or query.
我的代码:
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));
如果您不喜欢主要的 query/subquery 语法,您也可以使用交叉连接:
INSERT INTO contentTbl(crateID,itemID,qty)
SELECT crateTbl.crateID, itemTbl.itemID, ?
FROM crateTbl,itemTbl
WHERE crateTbl.crateID=? AND itemTbl.itemID = ?
(参数顺序需要重新调整一下,你自己算吧)
我不确定语法。我总是这样使用它(这是来自 VB,但 C# 应该类似):
cmd.Parameters.Addwithvalue("crateID", txtCrate.Text)
我已经试过了,它有点管用,但出于某种原因,它只适用于作为 ID 的项目 table 的值。如果我有 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();
如何使用 OleDB 从不同的表中插入参数?
我有 3 个表: 1. itemTbl 2.crateTbl 3.内容表
itemTbl 具有:itemID、itemName、itemDesc crateTbl 有:crateID,crateName contentTbl 具有:crateID、itemID、数量
contentTbl 是箱子的内容和每个箱子的数量
我需要它 select 我使用的不同表格中的值 WHERE
。我已经使用本地数据库和基于服务的数据库尝试了类似的代码,它们允许我使用,但 OleDB 不允许我使用 VALUES((SELECT))...
错误信息:
System.Data.OleDb.OleDbException: 'Query input must contain at least one table or query.
我的代码:
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));
如果您不喜欢主要的 query/subquery 语法,您也可以使用交叉连接:
INSERT INTO contentTbl(crateID,itemID,qty)
SELECT crateTbl.crateID, itemTbl.itemID, ?
FROM crateTbl,itemTbl
WHERE crateTbl.crateID=? AND itemTbl.itemID = ?
(参数顺序需要重新调整一下,你自己算吧)
我不确定语法。我总是这样使用它(这是来自 VB,但 C# 应该类似):
cmd.Parameters.Addwithvalue("crateID", txtCrate.Text)
我已经试过了,它有点管用,但出于某种原因,它只适用于作为 ID 的项目 table 的值。如果我有 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();