Oledb Вставить оператор, используя параметры - PullRequest
0 голосов
/ 07 октября 2018

Как вставить в параметры из разных таблиц, используя OleDB?

У меня есть 3 таблицы: 1. itemTbl 2. crateTbl 3. contentTbl

itemTbl имеет: itemID, itemName, itemDesc crateTblhas: 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 голосов
/ 07 октября 2018

Я не уверен насчет синтаксиса.Я всегда использую его как (это из VB, но C # должен быть похожим):

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

0 голосов
/ 07 октября 2018

Я пробовал это, и это вроде работает, но по какой-то причине работает только со значениями для таблицы элементов в качестве идентификаторов.Если у меня есть идентификатор (это целые числа), который есть у crateTbl, но нет 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();
0 голосов
/ 07 октября 2018

Сообщение об ошибке довольно наглядно.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 = ?

(Порядок параметровнужно снова настроить, но вы можете это понять).

...