我使用select查询读取值,然后使用下面的代码重新插入(不更新)它们。 我试图使用插入运行此查询并选择相同的时间但不起作用,我不会犯任何错误。
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 DocStatus=@stat and DocNo=@docno)";
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();
如果我在mysql workbench上运行相同的查询,则某些值正在运行。 这可能吗?我怎么能做到这一点?
答案后更新
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 DocStatus=@stat and DocNo=@docno)";
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 :(得分:1)
我看到了一些事情;
您无法参数化列名。您只能参数化您的值。这就是为什么@newdocno as DocNo
不应该起作用的原因。如果您想将此列作为输入,那么在将其连接到字符串或使用白名单之前,您确实会进行一些强有力的验证。
为了更清楚,您应该在命令中定义参数名称,并且参数集合相同。这意味着,如果你有
where DocStatus=@stat and DocNo=@docno
在命令中,您的参数集应该为;
cmd4.Parameters.AddWithValue("@stat", "1");
cmd4.Parameters.AddWithValue("@DocNo",no );
作为最佳做法,请勿使用AddWithValue
方法。 It might generates unexpected and surprising results。使用.Add()
method来指定参数类型及其大小。
使用using
statement自动处理数据库连接和命令,而不是手动调用Close
方法。
答案 1 :(得分: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 DocStatus=@stat and DocNo=@docno)";
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();