2015-07-06 4 views
0

Я использую select query для чтения значений, а затем повторно вставляю (не обновлять) их с некоторыми обновлениями с помощью кода ниже. Я пытаюсь запустить этот запрос со вставкой и выбрать одно и то же время, но не работает, и я не принимаю никаких ошибок.C# Insert And Select in one string query

string docdetls = "Insert into DocDetls (DocStatus, DocType, DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate)"+ 
        "(SELECT 2 as DocStatus, DocType, @newdocno as DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate FROM docdetls where [email protected] and [email protected])"; 
MySqlCommand cmd4 = new MySqlCommand(docdetls, con); 
cmd4.Parameters.AddWithValue("stat", "1"); 
cmd4.Parameters.AddWithValue("newdocno", DocNoTxtBox.Text); 
cmd4.Parameters.AddWithValue("DocNo",no); 
con.Open(); 
cmd4.ExecuteNonQuery(); 
con.Close(); 

Если я запускаю тот же запрос в workbench mysql с некоторыми значениями, работает. Это возможно? Как я могу сделать эту работу?

UPDATE после ответа

 string docdetls = "Insert into DocDetls (DocStatus, DocType, DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate)"+ 
         "(SELECT 2 as DocStatus, DocType, @newdocno as DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate FROM docdetls where [email protected] and [email protected])"; 
        MySqlCommand cmd4 = new MySqlCommand(docdetls, con); 
        cmd4.Parameters.AddWithValue("stat", "1"); 
        //cmd4.Parameters.AddWithValue("newdocno", DocNoTxtBox.Text); 
        cmd4.Parameters.AddWithValue("DocNo",no); 
        cmd4.Parameters.Add("@newdocno", MySqlDbType.Int16).Value = DocNoTxtBox.Text; 
        con.Open(); 
cmd4.ExecuteNonQuery(); 
        con.Close(); 

еще не работает ..

ответ

0

Я сделал это с кодом ниже

string docdetls = "Insert into DocDetls (DocStatus, DocType, DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate)"+ 
         "(SELECT 2 as DocStatus, DocType, @newdocno as DocNo,SeqNo,ItemCode,Quantity,Price,Disc,DiscAmount,VAT,ExpDate FROM docdetls where [email protected] and [email protected])"; 
        MySqlCommand cmd4 = new MySqlCommand(docdetls, con); 
        cmd4.Parameters.AddWithValue("stat", "1"); 
        //cmd4.Parameters.AddWithValue("newdocno", DocNoTxtBox.Text); 
        cmd4.Parameters.AddWithValue("DocNo",no); 
        cmd4.Parameters.Add("@newdocno", MySqlDbType.Int16).Value = DocNoTxtBox.Text; 
        con.Open(); 
        cmd4.ExecuteNonQuery(); 
        con.Close(); 
1

Я вижу несколько вещей;

Вы не можете параметризовать имена столбцов. Вы можете параметризовать только ваши значения. Вот почему @newdocno as DocNo не должен работать. Если вы хотите взять этот столбец в качестве ввода, вы действительно проведете сильную проверку, прежде чем конкатенировать его в своей строке или использовать белый список.

Для того, чтобы быть более понятным, вы должны определить свои имена параметров в своей команде и ваш набор параметров идентичен. Это означает, что если у вас есть

where [email protected] and [email protected] 

в вашей команде, ваш набор параметров должен быть таким;

cmd4.Parameters.AddWithValue("@stat", "1"); 
cmd4.Parameters.AddWithValue("@DocNo",no); 

В качестве лучшей практики, не используйте AddWithValue метод. It might generates unexpected and surprising results. Используйте .Add() method, чтобы указать тип параметра и его размер.

И используйте using statement для автоматического управления соединениями с базой данных и командами вместо вызова методов Close вручную.

+0

А как насчет @newdocno? Мне это нужно. Есть ли способ? – marios

+0

Является единственным вариантом белого списка? Можете ли вы показать мне пример с моим кодом, как сделать белый список? – marios

+0

@marios Я упомянул об этом в своем ответе. Вы пытаетесь параметризовать имя столбца, которое не разрешено. Вы должны использовать конкатенацию строк для своего столбца, но прежде чем вы это сделаете, вам нужно использовать _really_ strong validation перед тем, как поместить его в свой sql или создать белый список, который включает в себя действительные имена столбцов. –