I am trying to creat a database with two tables. i want to add in a foreign key in one of them. but the following code is not working, i debug it and i found that the only problem is in adding the foreign key.
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;
}
if i try antoher approach like the following one(open the database after creating it in the upper methode), it does not work too:
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;
}
i dont find a good documentation for the adox api with code examples, thats why i dont know how to solve this? thnx in advance
The problem is that you don't fill the
RelatedTable
andRelatedColumn
parameters. Replace the commented lines in your first piece of code with the following: