【问题标题】:C# Insert And Select in one string queryC# 在一个字符串查询中插入和选择
【发布时间】:2015-09-23 07:51:57
【问题描述】:

我使用选择查询来读取值,然后使用下面的代码通过一些更新重新插入(不更新)它们。 我正在尝试使用插入运行此查询并同时选择,但没有工作,我没有出现任何错误。

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 工作台上运行相同的查询是有效的。 这可能吗?我怎样才能做到这一点?

回答后更新

       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();

还是不行..

【问题讨论】:

  • 问题是关于插入 with 选择。与插入选择无关。

标签: c# mysql select insert


【解决方案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 方法。

【讨论】:

  • 那么@newdocno 呢?我需要它..有办法放吗?
  • 是唯一的选项白名单吗?你能用我的代码举例说明如何做白名单吗?
  • @marios 我在回答中提到了它。您尝试参数化不允许的列名。您应该为您的列使用字符串连接,但在此之前,您需要在将其放入 sql 或创建包含有效列名的白名单之前使用 really 强验证。
  • 我不需要验证这个文本框,因为我从我的代码中生成了数字并将它放在那里并且我设置了 enable=false..
  • 你的回答没有帮助我解决我的问题!我无法接受
【解决方案2】:

我已经用下面的代码完成了

 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();

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2012-04-12
    • 2014-09-01
    相关资源
    最近更新 更多