Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用cmd.c参数创建动态查询_C#_Sql_Asp.net_Stored Procedures_Dynamicquery - Fatal编程技术网

C# 使用cmd.c参数创建动态查询

C# 使用cmd.c参数创建动态查询,c#,sql,asp.net,stored-procedures,dynamicquery,C#,Sql,Asp.net,Stored Procedures,Dynamicquery,我知道有很多问题与创建动态查询有关,但没有人能帮助我。 我试图在foreach循环的帮助下创建一个动态cmd.Parameters.AddWithValue,但是我找不到在foreach中传递的所有值。我知道我在写var values=这就是值给我空值的方式 我提供的代码可能会帮助您解决错误 public void insert_Para(System.Web.UI.HtmlControls.HtmlGenericControl ControlName, String TableName)

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

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

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

这里的问题主要是时间问题。当字符串为空字符串时,您当前正在从一开始就将值连接到该字符串中。完成后:就这样-这就是您创建的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.StoredProcess。

请尝试此代码

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

问题是创建insert语句的字符串已设置。如果更改值,则不会更改SqlCommand@MarcGravell查询本身只是对SomeTable值的插入,没有任何参数或值。条件块在不实际更改查询的情况下添加参数。此代码既不是动态的,也不使用任何参数。构造查询时,值为空,这意味着SqlCommand对象试图对某个表执行无效查询。@PanagiotisKanavos它显然是要参数化的,与我回答的注释相反;它不工作的事实不应该让我们感到惊讶-如果代码按预期工作,我们很少看到关于这一点的问题:作为旁注:如果这是创建SQL的方式,那么您将非常容易受到控件顺序的影响-现在假设控件顺序与您假设@Minhaj Patel有一个数据集的列顺序完全匹配。这还需要额外调用数据库以获取元数据列名。您没有从OP中的文本框提供值。您没有处理SqlConnection或SqlCommand。