簡體   English   中英

使用參數的 Oledb Insert 語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM