если цикл не может прерваться

#c# #dao

#c# #dao

Вопрос:

Я работаю с dao, мой пользователь добавляет таблицу и ее поле. Мои программы проверяют, существует ли таблица, если да, то добавляется только поле, если таблица не существует, добавляется таблица, а затем добавляется поле.

Моя проблема возникает, когда я пытаюсь добавить второе поле. Это говорит мне, что таблица уже существует. Он не проходит через цикл надлежащим образом. вы можете помочь?

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

Комментарии:

1. Почему бы вам не объединить 2 оператора if в один и не избавиться от ненужных условий и скобок?

2. Что вы подразумеваете под ненужными условиями и скобками?

3. if(tb.Attributes == 0 amp;amp; tb.Name == myTable.Name) {//your condition}

4. Я отредактировал его, следуя вашему совету. Теперь мне нужно найти способ разорвать цикл, потому что он все еще говорит мне, что мое поле уже существует, но это не так.

5. Честно говоря, я не понимаю, откуда взялось это MyField. Вы уверены, что это имеет какое-либо значение?

Ответ №1:

Хорошо, вот в чем дело. Если у вас есть несколько таблиц в вашем операторе foreach, то ваш оператор if с проверкой, является ли Findtable ложным, достигается только после того, как все таблицы повторяются. Следовательно, вы должны переместить свой оператор if внутрь цикла, чтобы он мог добавить новую таблицу в случае, если она не существует. Практически, вот как это должно выглядеть:

     List<String> existingTables = new List<String>();
    foreach (TableDef tb in clsDataSource.mydb.TableDefs)
        {
               if (tb.Attributes == 0 amp;amp; 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
  

Таким образом, вы избавляетесь от другого условия и сразу добавляете свою таблицу, если она соответствует всем параметрам. Более того, вы также избавляетесь от этого логического значения, которое в данном случае не требуется. Как только все таблицы будут повторены, вы выйдете из цикла.

Комментарии:

1. Я не уверен, что понимаю, извините.

2. в моем цикле я проверяю свой атрибут, тогда, если моя новая таблица = таблица в базе данных.

3. Хорошо, извините. Я только что получил это, но это не работает, это не создает мою первую таблицу.

4. Если это не создает вашу первую таблицу, то проблема на самом деле в clsDataSource.mydb.TableDefs.Append(myTable); я не уверен, как в DAO, но это должно быть что-то вроде mydb.SaveChanges(); , что будет записывать ваши изменения в базу данных, как только вы примените к ней некоторые модификации.

5. До этого создавались таблицы. Вам не нужно сохранять изменения после добавления