2016-02-02 4 views
0

мой код dosent works. PLS исправить меня.Выбрать и вставить из двух таблиц Sql.C#

Пример Я хочу сказать, принимать 2 значения из (COLUMN *) Где .... и 2 значения из (COLUMN *) Где ....

con.Open(); 
SqlCommand cmd = new SqlCommand 
("INSERT INTO temp_rent(parts,size,color,quantities,barcode,name,mobile,code) select 
parts,size,color,quantities,barcode from inventory where barcode = ('" + textBox4.Text + "') 
select name,mobile,code from customermaster where code= '" + textBox1.Text + "')", con); 
        cmd.ExecuteNonQuery(); 
        con.Close(); 
+2

Прежде всего - вы не должны использовать конкатенацию текста запроса, так как это приводит к SQL-инъекции и возможным значениям проблем с экранированием. Вместо этого используйте параметризованные запросы. –

+2

'' Я хочу сделать его меньше и проще »- начните с форматирования его, чтобы быть более читаемым. Это само по себе делает длинный * способ сделать код более простым. – David

+0

В чем вопрос? Вы можете написать хранимую процедуру и вызывать ее вместо этого ... – Alex

ответ

0

Вот мой подход:

Первый В визуальной студии (2015) Я добавил источник данных. Пожалуйста, примите во внимание, что разные версии визуальной студии имеют разные способы добавления источника данных. Таким образом, в VS2015 мыши

  • проект
  • добавить базу данных нового источника данных
  • набор данных
  • настроить подключение к БД
  • выбирать таблицы Вы будете работать с
  • именем DataSet (шахта is SO_testDataSet)

После завершения работы у вас будет ... DataS et.xsd в проекте. Дважды щелкните по нему.

Здесь вы увидите таблицы, которые вы импортировали из базы данных. щелкните правой кнопкой мыши на заголовке temp_rent, потому что вы хотите создать запрос, который будет вставляться в temp_rent в конце.

  • Добавить
  • Запрос
  • Здесь Вы можете использовать "заявления Использование SQL" или "Создать новую хранимую процедуру". Я предлагаю второй, но для простоты сначала используйте первый.
  • Вставить
  • Вставьте следующее в текстовое поле. Проверьте это в Query Builder, если хотите.

    INSERT INTO temp_rent 
           (parts, size, color, quantities, barcode, name, mobile, code) 
    SELECT  i.parts, i.size, i.color, i.quantities, i.barcode, cm.name, cm.mobile, cm.code 
    FROM   inventory AS i CROSS JOIN 
           customermaster AS cm 
    WHERE  (cm.code = @code) AND (i.barcode = @barcode) 
    
  • Имя Ваш запрос (шахта InsertQuery)

Finish, сохраните. В запросе вы видите, что существует перекрестное соединение, потому что инвентарь и пользовательские мастера не соединены столбцом. Это простое декартово произведение. Вы также можете использовать или FROM inventory JOIN customermaster (потому что ON не является обязательным). Мы также видим, что @code и @barcode являются заполнителями для параметризованного запроса.

В коде можно использовать добавленный запрос, как это:

SO_testDataSetTableAdapters.temp_rentTableAdapter adapter = new SO_testDataSetTableAdapters.temp_rentTableAdapter(); 
// I assume that code and barcode are the type of int in the database. 
adapter.InsertQuery(int.Parse(textBox1.Text), int.Parse(textBox4.Text)); 

Если Textboxes будут содержащим некоторую злая строка, то int.Parse выбросит исключение, потому что зло строка не может быть разобрана как Int (для ради защиты от SQL-инъекции).

Смежные вопросы