Protected Overloads Overrides Sub Init()
If Initialized Then
Return
End If
Dim passedRelationNames As List(Of [String]) = New List(Of String)()
Connection.Open()
Try
Dim dt As DataTable = (TryCast(Connection, SqlConnection)).GetSchema("Tables")
For Each dr As DataRow In dt.Rows
Dim tableSchema As String = dr("TABLE_SCHEMA").ToString()
Dim tableType As String = dr("TABLE_TYPE").ToString()
Dim parentTableName As String = dr("TABLE_NAME").ToString()
Select Case tableType
Case "BASE TABLE"
If (SupportedElementTypes And DbConnectionElementTypes.Table) = 0 Then
Continue Select
End If
Exit Select
Case "VIEW"
If (SupportedElementTypes And DbConnectionElementTypes.View) = 0 Then
Continue Select
End If
Exit Select
Case Else
Continue Select
End Select
' pass table
Dim newConnection As SqlConnection = TryCast(DbCommandSetDataProviderHelper.CloneConnection(Connection), SqlConnection)
Dim cmd As New SqlCommand("Select * From """ + (If([String].IsNullOrEmpty(tableSchema), parentTableName + """", tableSchema + """.""" + parentTableName)) + """", newConnection)
Provider.AddCommand(TryCast(cmd, IDbCommand), parentTableName)
' pass relations
Dim commandText As String = "sp_fkeys @pktable_name = '" + parentTableName + "'"
If Not [String].IsNullOrEmpty(tableSchema) Then
commandText += ", @pktable_owner = '" + tableSchema + "'"
End If
cmd = New SqlCommand(commandText, TryCast(Connection, SqlConnection))
Dim reader As SqlDataReader = cmd.ExecuteReader()
While reader.Read()
Dim childColumnName As String = reader.GetSqlString(7).ToString()
Dim parentColumnName As String = reader.GetSqlString(3).ToString()
' combined primary key, add key field to last relation on stack
If reader.GetInt16(8) > 1 Then
Dim providerInterface As IDataProvider = (TryCast(Provider, IDataProvider))
Dim lastRelation As DbCommandTableRelation = TryCast(providerInterface.Relations(providerInterface.Relations.Count - 1), DbCommandTableRelation)
lastRelation.ChildColumnName += ControlChars.Tab + childColumnName
lastRelation.ParentColumnName += ControlChars.Tab + parentColumnName
Continue While
End If
Dim childTableName As String = reader.GetSqlString(6).ToString()
Dim relName As String = reader.GetSqlString(2).ToString() + "2" + childTableName
Dim relationIndex As Integer = 1
Dim formatString As String = relName + "{0}"
While passedRelationNames.Contains(relName)
relName = [String].Format(formatString, relationIndex)
System.Math.Max(System.Threading.Interlocked.Increment(relationIndex),relationIndex - 1)
End While
passedRelationNames.Add(relName)
Provider.AddRelation(relName, parentTableName, childTableName, parentColumnName, childColumnName)
End While
reader.Close()
Next
Finally
Connection.Close()
Initialized = True
End Try
End Sub