2014-03-31 121 views
2

我的访问文件中有两个表。我想创建它们之间的关系。下图是我在Access中手动创建的关系。在Access中创建关系

enter image description here

不过,我想创建VB.net的关系,这里是我的代码:

conn.Open() 

    daBooks = New OleDb.OleDbDataAdapter("SELECT * FROM Books", conn) 
    daAuthor = New OleDb.OleDbDataAdapter("SELECT * FROM authors", conn) 

    daBooks.Fill(ds, "Books") 
    daAuthor.Fill(ds, "authors") 

    conn.Close() 

    'Set the relation 
    Dim parentColumn As DataColumn 
    parentColumn = ds.Tables("authors").Columns("AuthorID") 

    Dim childColumn As DataColumn = New DataColumn 
    Try 
     childColumn = ds.Tables("Books").Columns("AuthorID") 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     Exit Sub 
    End Try 

    Dim a As String 
    a = ds.Tables("authors").Rows(0).Item("AuthorID") 
    Dim b As String 
    b = ds.Tables("Books").Rows(0).Item("AuthorID") 

    Dim relation As DataRelation = New _ 
      System.Data.DataRelation("Books_Authors", parentColumn, childColumn) 
    ds.Relations.Add(relation) 

    RelationName.Text = relation.RelationName 
    'End of setting relation 

    Dim cb1 As New OleDb.OleDbCommandBuilder(daBooks) 
    Dim cb2 As New OleDb.OleDbCommandBuilder(daAuthor) 

    Try 
     daBooks.Update(ds, "books") 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

    daAuthor.Update(ds, "authors") 

但是之后我跑的代码,它不能更改数据库。任何人都可以帮助我,这样我就可以在VB.NET中为两个表创建一个新的关系。

一般来说,我认为问题是,System.Data.DataRelationds.Relations.Add(relation)刚刚创建的dataset的关系,但它并没有被通过dataadapter或别的东西更新到database。我是这样说的,还是因为其他原因而纠正的。如果我是正确的,那么如何更新datasetdatabase

+0

你想互操作(http://wiki.lessthandot.com/index.php/Access,_Script_and_Relationships)或ADOX(http://allenbrowne.com/func-adox.html#CreateKeyAdox)? – Fionnuala

回答

2

您可以通过从OleDb连接执行ALTER TABLE语句来创建该关系。

ALTER TABLE Books 
ADD CONSTRAINT BooksRelationship 
FOREIGN KEY (AuthorID) REFERENCES Authors (AuthorID); 
+0

你能更具体吗?如何把它放在OleDb连接。非常感谢。 – 2342G456DI8

+0

我假设你已经有一个可用的OleDb连接。 conn.Open()是什么'conn'? – HansUp

+0

dbProvider =“PROVIDER = Microsoft.ACE.OLEDB.12.0;” dbSource =“Data Source =”+ Directory.GetCurrentDirectory()+“\ JustForFun.accdb” conn.ConnectionString = dbProvider&dbSource – 2342G456DI8

1

您可以在Access中创建一个宏,在您的表之间创建关系并通过VB.NET运行它。
下面是创建在MS Access的关系的函数:

Public Function MacroCreateRelation() 

Dim db As DAO.Database 

CreateRelation("Author", "IdAuthor", _ 
          "Book", "IdAuthor") 

Set db = Nothing 
End Function 


Private Function CreateRelation(primaryTblName As String, _ 
    primaryFieldName As String, _ 
    foreignTblName As String, _ 
    foreignFieldName As String) As Boolean 
On Error GoTo ErrHandler 

Dim myDB As DAO.Database 
Dim newRelation As DAO.Relation 
Dim relatingField As DAO.Field 
Dim relationName As String 

relationName = primaryTblName + "_" + primaryFieldName + _ 
    "__" + foreignTblName + "_" + foreignFieldName 

    Set myDB = CurrentmyDB() 

    ' First create the relation 
    Set newRelation = myDB.CreateRelation(relationName, _ 
     primaryTblName, foreignTblName) 
    'field of the primary table 
    Set relatingField = newRelation.CreateField(primaryFieldName) 
    'Then the field of the the second table 
    relatingField.ForeignName = foreignFieldName 

    'now just add the field to the relation 
    newRelation.Fields.Append relatingField 

    'Last but not least add the relation to the db 
    myDB.Relations.Append newRelation 

    Set myDB = Nothing 

    return True 

Exit Function 

    ErrHandler: 
    Debug.Print Err.Description + " [ " + relationName + "]" 
    return False 

End Function 

然后你刚才打电话从VB.NET宏。