2015-05-18 2 views
0

Я пытаюсь создать базу данных с двумя таблицами. Я хочу добавить внешний ключ в один из них. , но следующий код не работает, я его отлаживаю, и я обнаружил, что единственная проблема заключается в добавлении внешнего ключа.Как добавить внешний ключ к таблице доступа с помощью adox

private static bool creatDatabase() 
    { 
     bool result = false; 

     Catalog cat = new Catalog(); 
     Table tableCustomer = new Table(); 
     Table tableAddresses = new Table(); 

     //Create the table Customer and it's fields. 
     tableCustomer.Name = "Customer"; 
     tableCustomer.Columns.Append("Customer_ID", ADOX.DataTypeEnum.adInteger); 
     tableCustomer.Keys.Append("PrimaryKEy", KeyTypeEnum.adKeyPrimary, "Customer_ID"); 
     tableCustomer.Columns.Append("Name", ADOX.DataTypeEnum.adVarWChar, 50); 
     tableCustomer.Columns.Append("Email", ADOX.DataTypeEnum.adVarWChar, 50); 
     tableCustomer.Columns.Append("TelNumber", ADOX.DataTypeEnum.adVarWChar, 32); 
     tableCustomer.Columns.Append("Fax", ADOX.DataTypeEnum.adVarWChar, 32); 
     tableCustomer.Columns.Append("Street", ADOX.DataTypeEnum.adVarWChar, 50); 
     tableCustomer.Columns.Append("PostalCode", ADOX.DataTypeEnum.adInteger, 10); 
     tableCustomer.Columns.Append("City", ADOX.DataTypeEnum.adVarWChar, 50); 
     tableCustomer.Columns.Append("AdressCounter", ADOX.DataTypeEnum.adSmallInt); 

     tableAddresses.Name = "Addresses"; 
     tableAddresses.Columns.Append("Address_ID", ADOX.DataTypeEnum.adInteger); 
     tableAddresses.Keys.Append("PrimaryKEy", KeyTypeEnum.adKeyPrimary, "Address_ID"); 
     //tableAddresses.Columns.Append("Customer_ID", ADOX.DataTypeEnum.adInteger);    
     //tableAddresses.Keys.Append("ForeignKey", KeyTypeEnum.adKeyForeign, "Customer_ID"); ---> here is the Exception 
     tableAddresses.Columns.Append("Street", ADOX.DataTypeEnum.adVarWChar, 50); 
     tableAddresses.Columns.Append("PostalCode", ADOX.DataTypeEnum.adInteger, 10); 
     tableAddresses.Columns.Append("City", ADOX.DataTypeEnum.adVarWChar, 50); 

     try 
     { 
      cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Application.StartupPath + "\\Customers.mdb" + "; Jet OLEDB:Engine Type=5"); 
      cat.Tables.Append(tableCustomer); 
      cat.Tables.Append(tableAddresses); 

      //Now Close the database 
      ADODB.Connection con = cat.ActiveConnection as ADODB.Connection; 
      if (con != null) 
       con.Close(); 


      result = true; 
     } 
     catch (Exception ex) 
     { 
      result = false; 
     } 
     finally 
     { 
      if (!result) 
      { 
       ADODB.Connection con = cat.ActiveConnection as ADODB.Connection; 
       if (con != null) 
        con.Close(); 
       File.Delete(Application.StartupPath + "\\Customers.accdb"); 
      }     
     } 
     cat = null; 
     return result; 
    } 

если я попробовать antoher подход, как следующий один (открыть базу данных после его создания в верхней Methode), она не работает слишком:

private static bool addForeignKey() 
    { 
     bool retValue = true; 

     ADODB.Connection con = new Connection(); 
     Key kyForeign = new Key(); 
     Catalog cat = new Catalog(); 


     kyForeign.Name = "test"; 
     kyForeign.Type = KeyTypeEnum.adKeyForeign; 
     kyForeign.RelatedTable = "Customer"; 
     kyForeign.Columns.Append("CustomerID", ADOX.DataTypeEnum.adInteger); 
     kyForeign.Columns["CustomerID"].RelatedColumn = "Customer_ID"; 
     try 
     { 
      con.Open("Provider='Microsoft.JET.OLEDB.4.0';Data source ='" 
       + Application.StartupPath + "\\Customers.mdb';"); 
      cat.ActiveConnection = con; 
      cat.Tables["Addresses"].Keys.Append(kyForeign, KeyTypeEnum.adKeyForeign, ADOX.DataTypeEnum.adInteger); // here comes the Exception 
     } 
     catch 
     { 
      retValue = false; 
     } 
     finally 
     { 
      if(retValue) 
      { 
       if (con != null) 
        con.Close(); 
      } 
     } 
     return retValue; 
    } 

я не найти хорошую документацию для adox api с примерами кода, вот почему я не знаю, как это решить? thnx заблаговременно

+0

Какое сообщение об исключении? –

+0

в первом методе, если я раскомментирую обе команды, это исключение: invaild column id – Orientos

ответ

2

Проблема в том, что вы не заполняете параметры RelatedTable и RelatedColumn. Замените прокомментированные строки в вашем первом фрагменте кода:

 tableAddresses.Columns.Append("Customer_ID", ADOX.DataTypeEnum.adInteger); 
     tableAddresses.Keys.Append("ForeignKey", ADOX.KeyTypeEnum.adKeyForeign, "Customer_ID", "Customer", "Customer_ID"); 
+0

thats right. спасибо за помощь – Orientos

Смежные вопросы