【问题标题】:create a dynamic query using cmd.parameter c#使用 cmd.parameter c# 创建动态查询
【发布时间】:2019-02-09 09:40:45
【问题描述】:

我知道有很多与创建动态查询相关的问题,但没有人能帮助我。 我试图在foreach 循环的帮助下创建一个动态cmd.Parameters.AddWithValue,但我找不到我在foeach 中传递的所有值。我知道我在写 var values = " " 这就是值给我null value 的方式

我提供的代码可以帮助您解决错误

  public void insert_Para(System.Web.UI.HtmlControls.HtmlGenericControl ControlName, String TableName)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["con"].ToString()))
        {
            var values = "";
            SqlCommand cmd = new SqlCommand("insert into "+ TableName +" values(" + values + ")", con);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            foreach (var item in ControlName.Controls)
            {
                if (item is TextBox)
                {
                    cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
                    values += "@" + ((TextBox)item).ID + ",";
                }
            }

            if (con.State == ConnectionState.Closed)
                con.Open();
            cmd.ExecuteNonQuery();
        }
    }

【问题讨论】:

  • 问题是创建插入语句的字符串已经设置好了。如果您更改 values 您将不会更改 SqlCommand 中的字符串
  • @MarcGravell 查询本身只是一个INSERT INTO SomeTable VALUES(),没有任何参数值。条件块添加参数而不实际更改查询。
  • 这段代码既不是动态的,也没有使用任何参数。 values 在构造查询时为空,这意味着 SqlCommand 对象尝试对某个表执行无效查询。
  • @PanagiotisKanavos 显然 打算 被参数化,这与我回复的评论相反;它不工作的事实不应该让我们感到惊讶 - 如果代码按预期工作,我们很少在这里看到关于此的问题:)
  • 附带说明:如果这是您创建 SQL 的方式,您将非常容易受到控件顺序的影响 - 现在假设控制顺序与列顺序完全匹配

标签: c# sql asp.net stored-procedures dynamicquery


【解决方案1】:

这里的问题主要是时间问题之一。您当前正在将values 连接到字符串就在开头,当它是一个空字符串时。一旦你完成了:就是这样 - 这就是你创建的 SQL:

insert into Foo values()

这不会有帮助。我要么将连接推迟到 循环之后:

foreach (var item in ControlName.Controls)
{
    if (item is TextBox)
    {
        cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
        values += "@" + ((TextBox)item).ID + ",";
    }
}
cmd.CommandText = "insert into "+ TableName +" values(" + values + ")";

或者我会在整个过程中使用StringBuilder

var sql = new StringBuilder("insert into [").Append(TableName)
              .Append("] values(");
foreach (var item in ControlName.Controls)
{
    if (item is TextBox)
    {
        cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
        sql.Append("@").Append(((TextBox)item).ID).Append(",");
    }
}
cmd.CommandText = sql.Append(")").ToString();

另请注意:这是CommandType.CommandText,而不是CommandType.StoredProcedure

【讨论】:

    【解决方案2】:

    请试试这个代码。

      public void Insert_Data_generic(DataSet dsins)
      {
            SqlConnection con = new SqlConnection(connectionstring);
            string Result = "insert into TableName (";
            SqlCommand cmd = new SqlCommand();    
            con.Open();
            string columns = string.Join(",", dsins.Tables[0].Columns.Cast<DataColumn>().Select(c => c.ColumnName));
            string values = string.Join(",", dsins.Tables[0].Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName)));
    
            Result += columns + ") values(" + values + ")";
            foreach (DataRow row in dsins.Tables[0].Rows)
            {
                cmd = new SqlCommand(Result, con);
                cmd.Parameters.Clear();
                foreach (DataColumn col in dsins.Tables[0].Columns)
                {
                    cmd.Parameters.AddWithValue("@" + col.ColumnName, row[col]);
    
                }
                cmd.ExecuteNonQuery();
            }
         }
    

    【讨论】:

    • 您假设@Minhaj Patel 有一个数据集。这也需要额外调用数据库来获取元数据(列名)。您没有从 OP 中的 TextBox 提供值。您没有处理 SqlConnection 或 SqlCommand。
    猜你喜欢
    • 2013-09-16
    • 2017-04-20
    • 1970-01-01
    • 2017-12-03
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多