создать динамический запрос, используя cmd.parameter c # - PullRequest
0 голосов
/ 04 сентября 2018

Я знаю, что есть много вопросов, связанных с созданием динамического запроса, но никто не может мне помочь. Я пытаюсь создать динамический cmd.Parameters.AddWithValue с помощью цикла foreach, но я не могу найти все значения, которые я передаю в foeach. Я знаю, что пишу var values ​​= "" , поэтому значения дают мне null значение

Я предоставляю мой код, который поможет вам решить ошибку

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

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Пожалуйста, попробуйте этот код.

  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();
        }
     }
0 голосов
/ 04 сентября 2018

Проблема здесь в основном из-за времени. В настоящее время вы объединяете 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.

...