[英]Oledb Insert statement using parameters
如何使用 OleDB 從不同表插入參數?
我有 3 個表:1. itemTbl 2. crateTbl 3. contentTbl
itemTbl 有:itemID、itemName、itemDesc crateTbl 有:crateID、crateName contentTbl 有:crateID、itemID、qty
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;
錯誤消息非常具有描述性。 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.Addwithvalue("crateID", txtCrate.Text)
我試過這個,它有點工作,但由於某種原因,只適用於作為 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.