【问题标题】:How to split comma separated values如何拆分逗号分隔值
【发布时间】:2014-02-25 20:18:04
【问题描述】:

我在 gridview 中有文本框,我正在执行并插入语句循环遍历我的 gridview 中的每一行。我现在的问题是我可以在文本框中有多个名称,如下所示:

John Carter, Mike David, John Edward,

那么,如何将每个人的姓名拆分并插入到具有相同 ID 的表中?例如,如果当前行的 ID =12,那么我的表将如下所示:

ID      Full_Name
12     John Carter
12     Mike David
12     John Edward

这是我的代码:

 foreach (GridViewRow row in GridView1.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                Label ID = row.FindControl("lbl_ID") as Label;                
                TextBox myUID = row.FindControl("txt_UID") as TextBox;
                string Full_Name = Request.Form[row.FindControl("txt_UID").UniqueID];

                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ConnectionString);
                SqlCommand cmd = new SqlCommand();

                cmd.CommandType = CommandType.Text;
                cmd.CommandText = @"if not exists(select ID from myTable where ID = @ID)
                                   insert into myTable(ID, Full_Name) values(@ID, @Full_Name)
                                    else update myTable set Full_Name =@Full_Name where ID =@ID";

                cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
                cmd.Parameters.Add("@Full_Name", SqlDbType.VarChar).Value = Full_Name.ToString();

                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

            }
}

【问题讨论】:

  • ID 是什么?如果它是您表的主键,那将是不可能的。
  • 不,它是不同的 ID。
  • 您需要通过针对 Full_Name 调用 String.Split 来捕获逗号分隔的元素,并且鉴于您的代码设置方式,您需要遍历插入每个结果值的代码。
  • 谢谢大卫,但我无法让它工作
  • 让我尝试修改上面的代码并将其发布为可能的解决方案。

标签: c# asp.net sql gridview


【解决方案1】:
string str = "John Carter, Mike David, John Edward,";
string[] names = str.Split(',');
foreach (string name in names)
{
    if (name.Equals(""))
        continue;

    ///dbstuff
    ///insert into myTable(ID, Full_Name) values(@ID, @name)
    ///etc, etc
}

这个强烈假设 ID 不是主键。只要 ID 不是唯一的并且不是键,这种方法就可以工作。

【讨论】:

    【解决方案2】:

    你可以像这样使用循环来执行查询

    foreach (string name in Full_Name.Split(','))
    {
      cmd.CommandText = @"if not exists(select ID from myTable where ID = @ID)
                            insert into myTable(ID, Full_Name) values(@ID, @Full_Name)
                          else update myTable set Full_Name =@Full_Name where ID =@ID";
    
      cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
      cmd.Parameters.Add("@Full_Name", SqlDbType.VarChar).Value = name
    
      cmd.Connection = con;
      con.Open();
      cmd.ExecuteNonQuery();
      con.Close();
    }
    

    【讨论】:

      【解决方案3】:

      这是我在上面评论中的建议的一个非常粗略/快速的概念。还没来得及测试。

       foreach (GridViewRow row in GridView1.Rows)
              {
                  if (row.RowType == DataControlRowType.DataRow)
                  {
                      Label ID = row.FindControl("lbl_ID") as Label;                
                      TextBox myUID = row.FindControl("txt_UID") as TextBox;
                      string Full_Name = Request.Form[row.FindControl("txt_UID").UniqueID];
      
                      SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ConnectionString);
                      SqlCommand cmd = new SqlCommand();
      
                      cmd.CommandType = CommandType.Text;
                      cmd.CommandText = @"if not exists(select ID from myTable where ID = @ID)
                                         insert into myTable(ID, Full_Name) values(@ID, @Full_Name)
                                          else update myTable set Full_Name =@Full_Name where ID =@ID";
                      cmd.Connection = con;
                      con.Open();
                      foreach(string currentName in Full_Name.Split(','))
                      {
                          if (currentName!="")
                          {
                              cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
                              cmd.Parameters.Add("@Full_Name", SqlDbType.VarChar).Value = currentName;
      
                              cmd.ExecuteNonQuery();
                              cmd.Parameters.Clear();
                          }
                      }
                      con.Close();
      
                  }
      }
      

      【讨论】:

      • 如果文本中只有一个这样的名字怎么办:John Edward,这可以与这段代码一起使用吗?
      • 我收到此错误:“字符串”不包含 CurrentName 的定义
      • 我也意识到您可以简单地直接分配参数值,而不是在每次迭代时清除/添加,但我不会冒险在这一点上混淆这个问题。
      • 我收到此错误:“ConnectionString 属性尚未初始化”,因此它似乎插入了第一个名称,但未能插入其余名称。
      • 好的,@moe,等一下,我会解决的。
      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2018-12-25
      • 2011-07-26
      相关资源
      最近更新 更多