2016-10-23 8 views
1

나는 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); 
     } 
+0

왜 if 문을 2 개로 병합하고 불필요한 조건과 대괄호를 제거하지 않으시겠습니까? –

+0

불필요한 조건과 괄호는 무엇을 의미합니까? – NewPassionnate

+0

'if (tb.Attributes == 0 && tb.Name == myTable.Name) {// 귀하의 상태}' –

답변

1

좋아요, 여기 있습니다. foreach 문에 여러 개의 테이블이있는 경우 모든 테이블이 반복 된 후에 만 ​​Findtable이 false인지 확인하면서 if 문을 수행합니다. 따라서 루프 내에서 if 문을 이동해야하므로 존재하지 않는 경우 새 테이블을 추가 할 수 있습니다. 실제로는 다음과 같이 표시되어야합니다 :

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 

이렇게하면 모든 조건과 일치하면 다른 조건을 없애고 즉시 표를 추가 할 수 있습니다. 또한이 경우 불필요한 부울 값을 제거합니다. 모든 테이블이 반복되면 루프를 종료합니다.

+0

죄송합니다. – NewPassionnate

+0

내 루프에서 내 속성을 확인한 다음 새 테이블이 데이터베이스의 테이블인지 확인합니다. – NewPassionnate

+0

죄송합니다. 방금 가져 왔지만 작동하지 않습니다. 첫 번째 테이블을 만들지 않습니다. – NewPassionnate