如果循环不能中断
if loop can't break
我正在使用 dao,我的用户正在添加一个 table 及其字段。我的程序检查 table 是否存在,如果存在,则仅添加字段,如果 table 不存在,则添加 table 然后附加字段。
当我尝试添加第二个字段时出现问题。它告诉我 table 已经存在。它没有以正确的方式通过循环。你能帮忙吗?
string tablename = txtNameTable.Text.Trim();
string fieldname = txtFieldName.Text.Trim();
string size = txtSize.Text.Trim();
//create a table
myTable = clsDataSource.mydb.CreateTableDef(tablename);
//create fields
if (cboFieldType.SelectedItem.ToString() == "Text")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbText, size);
}
if (cboFieldType.SelectedItem.ToString() == "AutoNumber")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbLong);
myField.Attributes = (int)DAO.FieldAttributeEnum.dbAutoIncrField;
}
if (cboFieldType.SelectedItem.ToString() == "Number")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbLong, size);
}
if (cboFieldType.SelectedItem.ToString() == "Date")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbDate);
}
//check if table exists
bool tableExist = false;
foreach (TableDef tb in clsDataSource.mydb.TableDefs)
{
if (tb.Name == myTable.Name)
{
myTable.Fields.Append(myField);
tableExist = true;
break;
}
}
if (tableExist == false)
{
myTable.Fields.Append(myField);
clsDataSource.mydb.TableDefs.Append(myTable);
}
//add primary key
if (ckPK.Checked == true)
{
Index myIndex = myTable.CreateIndex("PrimaryKey");
myField = myIndex.CreateField(fieldname);
((IndexFields)myIndex.Fields).Append(myField);
myIndex.Primary = true;
try
{
clsDataSource.mydb.TableDefs[myTable.Name].Indexes.Append(myIndex);
}
catch (Exception)
{
MessageBox.Show("This table already has a primary key", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Activate(true, true, true);
}
好的,事情是这样的。如果您的 foreach 语句中有多个 tables,那么只有在所有 tables 被迭代后,才会到达检查 Findtable 是否为 false 的 if 语句。因此,您必须将 if 语句移动到循环内,以便它可以添加一个新的 table 以防它不存在。实际上,它应该是这样的:
List<String> existingTables = new List<String>();
foreach (TableDef tb in clsDataSource.mydb.TableDefs)
{
if (tb.Attributes == 0 && tb.Name == myTable.Name)
{
clsDataSource.mydb.TableDefs[myTable.Name].Fields.Append(myField);
myTable.Fields.Append(myField);
clsDataSource.mydb.TableDefs.Append(myTable);
}
else {
existingTables.Add(MyTable.Name.ToString());
}
}//end foreach
foreach (var el in existingTables){
MessageBox.Show("This table already exists: {0}", el)
}//end foreach
因此,您摆脱了另一个条件并在匹配所有参数时立即添加您的 table。此外,您还摆脱了那个布尔值,在这种情况下这是不必要的。迭代完所有 table 后,您将退出循环。
我正在使用 dao,我的用户正在添加一个 table 及其字段。我的程序检查 table 是否存在,如果存在,则仅添加字段,如果 table 不存在,则添加 table 然后附加字段。
当我尝试添加第二个字段时出现问题。它告诉我 table 已经存在。它没有以正确的方式通过循环。你能帮忙吗?
string tablename = txtNameTable.Text.Trim();
string fieldname = txtFieldName.Text.Trim();
string size = txtSize.Text.Trim();
//create a table
myTable = clsDataSource.mydb.CreateTableDef(tablename);
//create fields
if (cboFieldType.SelectedItem.ToString() == "Text")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbText, size);
}
if (cboFieldType.SelectedItem.ToString() == "AutoNumber")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbLong);
myField.Attributes = (int)DAO.FieldAttributeEnum.dbAutoIncrField;
}
if (cboFieldType.SelectedItem.ToString() == "Number")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbLong, size);
}
if (cboFieldType.SelectedItem.ToString() == "Date")
{
myField = myTable.CreateField(fieldname, DAO.DataTypeEnum.dbDate);
}
//check if table exists
bool tableExist = false;
foreach (TableDef tb in clsDataSource.mydb.TableDefs)
{
if (tb.Name == myTable.Name)
{
myTable.Fields.Append(myField);
tableExist = true;
break;
}
}
if (tableExist == false)
{
myTable.Fields.Append(myField);
clsDataSource.mydb.TableDefs.Append(myTable);
}
//add primary key
if (ckPK.Checked == true)
{
Index myIndex = myTable.CreateIndex("PrimaryKey");
myField = myIndex.CreateField(fieldname);
((IndexFields)myIndex.Fields).Append(myField);
myIndex.Primary = true;
try
{
clsDataSource.mydb.TableDefs[myTable.Name].Indexes.Append(myIndex);
}
catch (Exception)
{
MessageBox.Show("This table already has a primary key", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Activate(true, true, true);
}
好的,事情是这样的。如果您的 foreach 语句中有多个 tables,那么只有在所有 tables 被迭代后,才会到达检查 Findtable 是否为 false 的 if 语句。因此,您必须将 if 语句移动到循环内,以便它可以添加一个新的 table 以防它不存在。实际上,它应该是这样的:
List<String> existingTables = new List<String>();
foreach (TableDef tb in clsDataSource.mydb.TableDefs)
{
if (tb.Attributes == 0 && tb.Name == myTable.Name)
{
clsDataSource.mydb.TableDefs[myTable.Name].Fields.Append(myField);
myTable.Fields.Append(myField);
clsDataSource.mydb.TableDefs.Append(myTable);
}
else {
existingTables.Add(MyTable.Name.ToString());
}
}//end foreach
foreach (var el in existingTables){
MessageBox.Show("This table already exists: {0}", el)
}//end foreach
因此,您摆脱了另一个条件并在匹配所有参数时立即添加您的 table。此外,您还摆脱了那个布尔值,在这种情况下这是不必要的。迭代完所有 table 后,您将退出循环。