【问题标题】:Trying to skip a column in a foreach statement C#尝试在 foreach 语句 C# 中跳过一列
【发布时间】:2018-09-13 00:06:03
【问题描述】:

我正在制定一个库存管理计划。数据库和表系统的设置方式是,每个类别都是不同的表。这是必要的,因为每个类别(即鞋子、电话、笔记本电脑)都有不同的字段来唯一标识每个产品。因此,我创建了一个表,然后通过 foreach 语句添加名为列的用户。我遇到的问题是它想在 ID 列已经存在时添加它。我尝试添加嵌套在 foreach 中的 If 语句,但它只是不断打破 foreach 循环。我只是还没有找到一种方法让它跳过 ID 列并继续添加要添加的每一列。

功能代码如下:

private void btnCreateCategory_Click(object sender, EventArgs e)
{
    List<string> FieldNames = new List<string>();

    foreach (var item in lstFieldNames.Items)
    {
        FieldNames.Add(lstFieldNames.Items.ToString());
    }

    DataTable NewCategory = new DataTable();
    NewCategory = CreateTable(FieldNames);
    dgPreviewAdd.DataSource = NewCategory;

    using (SqlConnection Connection = new SqlConnection(
       Helper.cnnVal("InventoryManager")))
    {
        using (SqlCommand command = new SqlCommand("", Connection))
        {
            command.CommandText = "Create Table tbl" + 
                NewCategory.TableName.ToString() + "(ID int)";

            Connection.Open();
            command.ExecuteNonQuery();
            Connection.Close();

            foreach (DataColumn newColumn in NewCategory.Columns)
            {
                 If( newColumn.ColumnName("ID")
                  {
                  }
                  Else
                  {
                SqlParameter colparam = new SqlParameter();
                colparam.ParameterName = "@ColumnName";
                colparam.Value = newColumn.ColumnName.ToString();

                SqlParameter tblParam = new SqlParameter();
                tblParam.ParameterName = "@TableName";
                tblParam.Value = "tbl" + NewCategory.TableName.ToString();

                command.Parameters.Add(colparam);
                command.Parameters.Add(tblParam);
                command.CommandText = "dbo.AddCategoryColumns";
                command.CommandType = CommandType.StoredProcedure;

                Connection.Open();
                command.ExecuteNonQuery();
                Connection.Close();
                }
            }

            LoadCategory catTableLoad = new LoadCategory();
            DataTable catTable = new DataTable();
            catTable = catTableLoad.getCategoryTable();

            SqlParameter param = new SqlParameter();
            param.ParameterName = "@CategoryName";
            param.Value = NewCategory.TableName.ToString();

            SqlParameter param2 = new SqlParameter();
            param2.ParameterName = "@IdNumber";
            param2.Value = catTable.Rows.Count + 1;

            command.Parameters.Add(param);
            command.Parameters.Add(param2);

            command.CommandText = "dbo.AddCategory";
            command.CommandType = CommandType.StoredProcedure;

            Connection.Open();
            command.ExecuteNonQuery();
            Connection.Close();
        }
    }
}

【问题讨论】:

  • 你能指出跳过ID列的代码吗?
  • 抱歉,一定是副本丢失了。我在 if else 语句中添加了。
  • 您可以在存储过程中检查该列是否确实已经存在,如果存在则跳过添加
  • 对于完全不同的方法,请参阅en.wikipedia.org/wiki/…

标签: c# foreach multiple-columns create-table


【解决方案1】:

使用以下任何一种:

foreach (DataColumn newColumn in NewCategory.Columns)
{
    if (newColumn.ColumnName == "ID") continue;

    //Rest of logic goes here
}

或者完全从循环中排除:

foreach (DataColumn newColumn in NewCategory.Columns.Where( c => c.ColumnName != "ID" ))
{

    //Rest of logic goes here
}

【讨论】:

    【解决方案2】:

    您可以使用 distinct 对类别进行分组

    不要忘记使用 System.Linq 添加;

    private void btnCreateCategory_Click(object sender, EventArgs e)
        {
            List<string> FieldNames = new List<string>();
    
            foreach (var item in lstFieldNames.Items)
            {
                FieldNames.Add(lstFieldNames.Items.ToString());
            }
    
            var grpfieldNames = FieldNames.Distinct();
    
            DataTable NewCategory = new DataTable();
    
            NewCategory = CreateTable(grpfieldNames);
    
            dgPreviewAdd.DataSource = NewCategory;
    
            using (SqlConnection Connection = new SqlConnection(
               Helper.cnnVal("InventoryManager")))
            {
                using (SqlCommand command = new SqlCommand("", Connection))
                {
                    command.CommandText = "Create Table tbl" +
                        NewCategory.TableName.ToString() + "(ID int)";
    
                    Connection.Open();
                    command.ExecuteNonQuery();
                    Connection.Close();
    
                    foreach (DataColumn newColumn in NewCategory.Columns)
                    {
                        If(newColumn.ColumnName("ID")
                          {
                        }
                        Else
                          {
                            SqlParameter colparam = new SqlParameter();
                            colparam.ParameterName = "@ColumnName";
                            colparam.Value = newColumn.ColumnName.ToString();
    
                            SqlParameter tblParam = new SqlParameter();
                            tblParam.ParameterName = "@TableName";
                            tblParam.Value = "tbl" + NewCategory.TableName.ToString();
    
                            command.Parameters.Add(colparam);
                            command.Parameters.Add(tblParam);
                            command.CommandText = "dbo.AddCategoryColumns";
                            command.CommandType = CommandType.StoredProcedure;
    
                            Connection.Open();
                            command.ExecuteNonQuery();
                            Connection.Close();
                        }
                    }
    
                    LoadCategory catTableLoad = new LoadCategory();
                    DataTable catTable = new DataTable();
                    catTable = catTableLoad.getCategoryTable();
    
                    SqlParameter param = new SqlParameter();
                    param.ParameterName = "@CategoryName";
                    param.Value = NewCategory.TableName.ToString();
    
                    SqlParameter param2 = new SqlParameter();
                    param2.ParameterName = "@IdNumber";
                    param2.Value = catTable.Rows.Count + 1;
    
                    command.Parameters.Add(param);
                    command.Parameters.Add(param2);
    
                    command.CommandText = "dbo.AddCategory";
                    command.CommandType = CommandType.StoredProcedure;
    
                    Connection.Open();
                    command.ExecuteNonQuery();
                    Connection.Close();
                }
            }
        }
    

    【讨论】:

    • 这还能编译吗? newColumn.ColumnName("ID") 错过了关闭 ) 以及在 ColumnName 是一个属性的情况下似乎不是正确的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2014-06-04
    • 2012-05-22
    • 1970-01-01
    • 2011-02-01
    • 2011-02-22
    相关资源
    最近更新 更多