Skip to main content

AccessTr.neT


Access Bağlatısı

Access Bağlatısı

#7
Visual studio ile verilerin Access vt veritabanında saklandığı bir program yazıyorum.
Kullandığım bu Access veritabanı bağlı tablo yöneticisi ile başka bir klasördeki Access veritabanına bağlı.
Bu kullandığım Access veritabanında bulunan ve başka bir veritabanına bağlı olan tablonun bağlı olduğu veritabanı dosya yolunu / bağlantı yolunu
hangi kod ile görebilirim?

Teşekkürler

Aşağıdaki kodu deniyorum , "Kayıtlar okunamıyor; 'MSysObjects' için okuma yetkisi yok." uyarısı veriyor

PHP Kod:
Private Sub Button20_Click(sender As System.ObjectAs System.EventArgsHandles Button20.Click
        Dim sql 
As String "SELECT DISTINCTROW msysobjects.Name, msysobjects.Database, msysobjects.Connect FROM msysobjects WHERE (((msysobjects.Type)=6)) " ' 
        sql = "SELECT * FROM MSysObjects  WHERE Type=1 AND Flags=0"
        Dim baglanti As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DataBase.mdb ;Persist Security Info=True;Jet OLEDB:Database ")
        Dim veriler As New DataTable("Tablo_Linkleri")
        Dim adapter As New OleDbDataAdapter(Sql, baglanti)
        adapter.Fill(veriler)
        DataGridView1.DataSource = veriler
    End Sub 
Cevapla
#8
Bağlı tabloların bilgilerini almak için kullandığınız MSysObjects tablosuna erişim yetkileri genellikle kısıtlıdır ve bu nedenle bu tabloya doğrudan sorgu yapmak bahsettiğiniz yetki hatalarına neden olabilir. Bununn yerine bağlı tablonun bağlı olduğu veritabanının dosya yolunu TableDefs koleksiyonunu kullanarak alabilirsiniz. Örnek kod şöyle olabilir
Kod:
Imports System.Data.OleDb
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim tableName As String = "BağlıTabloAdı" ' Bağlı tablo adını buraya girin
        Dim connectionString As String = "provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DataBase.mdb;Persist Security Info=True;Jet OLEDB:Database Password=Şifre" ' Eğer var ise şifreyi girin
        Try
            Using connection As New OleDbConnection(connectionString)
                connection.Open()
                Dim linkedDbPath As String = GetLinkedDatabasePath(connection, tableName) ' Bağlı tablonun bağlı olduğu veritabanını al
                If Not String.IsNullOrEmpty(linkedDbPath) Then ' Sonuçları görüntüle
                    MessageBox.Show("Bağlı Tablonun Bağlı Olduğu Veritabanı Yolu: " & linkedDbPath)
                Else
                    MessageBox.Show("Bağlı Tablo Bulunamadı")
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show("Hata: " & ex.Message)
        End Try
    End Sub
Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim tableDef As TableDef = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, {Nothing, Nothing, tableName, Nothing}).Rows(0)("TABLE_NAME") ' Bağlı tablonun veritabanının dosya yolunu al
        If tableDef IsNot Nothing Then
            dbPath = tableDef.Connect
        End If
        Return dbPath
    End Function
End Class

Cevapla
#9
Teşekkür ederim ilginiz için. Fakat Kodlarınızı denedim, TableDefs koleksiyonu çalışmıyor.

[img]C:\Users\Quadro-4\Downloads\access[/img]

Dim tableDef As TableDef = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, {Nothing, Nothing, tableName, Nothing}).Rows(0)("TABLE_NAME")

satırı üzerinde

Type 'TableDef' is not defined.

uyarısı veriyor
Son Düzenleme: 29/02/2024, 11:32, Düzenleyen: umutakkaya.
Cevapla
#10
Verdiğim kod sadece size fikir vermesi açısından örnekti. TableDef System.Data.OleDb kitaplığında bulunmaz bunun için DAO kitaplığını eklemeniz gerekir. Projenizde Solution Explorer'dan Manage NuGet Packages seçeneğine girin ve Browse'u tıklayıp Microsoft.Office.Interop.Access.Dao paketini bulup install ederek projenize ekleyin. İşlemi tamamladıktan sonra yukarıdaki kodu
Kod:
Imports System.Data.OleDb
Imports Microsoft.Office.Interop.Access.Dao ' DAO'yu ekleyin

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim tableName As String = "BağlıTabloAdı" ' Bağlı tablo adını buraya girin
        Dim connectionString As String = "provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DataBase.mdb;Persist Security Info=True;Jet OLEDB:Database Password=Şifre" ' Eğer var ise şifreyi girin
        Try
            Using connection As New OleDbConnection(connectionString)
                connection.Open()
                Dim linkedDbPath As String = GetLinkedDatabasePath(connection, tableName) ' Bağlı tablonun bağlı olduğu veritabanını al
                If Not String.IsNullOrEmpty(linkedDbPath) Then ' Sonuçları görüntüle
                    MessageBox.Show("Bağlı Tablonun Bağlı Olduğu Veritabanı Yolu: " & linkedDbPath)
                Else
                    MessageBox.Show("Bağlı Tablo Bulunamadı")
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show("Hata: " & ex.Message)
        End Try
    End Sub
Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim tableDef As TableDef = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, {Nothing, Nothing, tableName, Nothing}).Rows(0)("TABLE_NAME") ' Bağlı tablonun veritabanının dosya yolunu al
        If tableDef IsNot Nothing Then
            dbPath = tableDef.Connect
        End If
        Return dbPath
    End Function
Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim dbEngine As New DBEngine() ' DAO DBEngine kullanımı
        Dim db As Database = dbEngine.OpenDatabase(connection.DataSource) ' Veritabanını aç
        For Each tableDef As TableDef In db.TableDefs
            If tableDef.Name = tableName Then
                dbPath = tableDef.Connect
                Exit For
            End If
        Next
        db.Close()
        Return dbPath
    End Function
End Class

mantığında düzenleyerek kullanabilirsiniz.
Cevapla
#11
(29/02/2024, 13:06)atoykan yazdı: Verdiğim kod sadece size fikir vermesi açısından örnekti. TableDef System.Data.OleDb kitaplığında bulunmaz bunun için DAO kitaplığını eklemeniz gerekir. Projenizde Solution Explorer'dan Manage NuGet Packages seçeneğine girin ve Browse'u tıklayıp Microsoft.Office.Interop.Access.Dao paketini bulup install ederek projenize ekleyin. İşlemi tamamladıktan sonra yukarıdaki kodu
Kod:
Imports System.Data.OleDb
Imports Microsoft.Office.Interop.Access.Dao ' DAO'yu ekleyin

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim tableName As String = "BağlıTabloAdı" ' Bağlı tablo adını buraya girin
        Dim connectionString As String = "provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DataBase.mdb;Persist Security Info=True;Jet OLEDB:Database Password=Şifre" ' Eğer var ise şifreyi girin
        Try
            Using connection As New OleDbConnection(connectionString)
                connection.Open()
                Dim linkedDbPath As String = GetLinkedDatabasePath(connection, tableName) ' Bağlı tablonun bağlı olduğu veritabanını al
                If Not String.IsNullOrEmpty(linkedDbPath) Then ' Sonuçları görüntüle
                    MessageBox.Show("Bağlı Tablonun Bağlı Olduğu Veritabanı Yolu: " & linkedDbPath)
                Else
                    MessageBox.Show("Bağlı Tablo Bulunamadı")
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show("Hata: " & ex.Message)
        End Try
    End Sub
Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim tableDef As TableDef = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, {Nothing, Nothing, tableName, Nothing}).Rows(0)("TABLE_NAME") ' Bağlı tablonun veritabanının dosya yolunu al
        If tableDef IsNot Nothing Then
            dbPath = tableDef.Connect
        End If
        Return dbPath
    End Function
Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim dbEngine As New DBEngine() ' DAO DBEngine kullanımı
        Dim db As Database = dbEngine.OpenDatabase(connection.DataSource) ' Veritabanını aç
        For Each tableDef As TableDef In db.TableDefs
            If tableDef.Name = tableName Then
                dbPath = tableDef.Connect
                Exit For
            End If
        Next
        db.Close()
        Return dbPath
    End Function
End Class

mantığında düzenleyerek kullanabilirsiniz.

Teşekkür ederim. Sağolun.



Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim dbEngine As New DBEngine() ' DAO DBEngine kullanımı
        Dim db As Database = dbEngine.OpenDatabase(connection.DataSource) ' Veritabanını aç
        For Each tableDef As TableDef In db.TableDefs
            If tableDef.Name = tableName Then
                dbPath = tableDef.Connect
                Exit For
            End If
        Next
        db.Close()
        Return dbPath
    End Function
function ile bu işlem tamam olur gibi. Sorun şu; bağlı tablo olan yani başka bir klasördeki Access veritabanı tablolarına bağlı olan acces veritabanını şifrelediğim zaman  connectionString kısmına bu Access VERİTABANIMA AİT şifreyi yazsamda okumuyor. "HATA GEÇERSİZ PAROLA YAZIYOR". Acces veritabanımda Şifreyi kaldırınca okuyor şifreli olunca okumuyor.

Teşekkürler.Kodlar aşağıda
Kod:
Private Sub Button19_Click(sender As System.Object, e As System.EventArgs) Handles Button19.Click
        Dim tableName As String = "tb_personel_bilgileri" ' Bağlı tablo adını buraya girin
        Dim connectionString As String = "provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DataBase.mdb ;Persist Security Info=True;Jet OLEDB:Database Password=12212"
        Try
            Using connection As New OleDbConnection(connectionString)
                connection.Open()
                Dim linkedDbPath As String = GetLinkedDatabasePath(connection, tableName) ' Bağlı tablonun bağlı olduğu veritabanını al
                If Not String.IsNullOrEmpty(linkedDbPath) Then ' Sonuçları görüntüle
                    MessageBox.Show("Bağlı Tablonun Bağlı Olduğu Veritabanı Yolu: " & linkedDbPath)
                Else
                    MessageBox.Show("Bağlı Tablo Bulunamadı")
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show("Hata: " & ex.Message)
        End Try
    End Sub

    Private Function GetLinkedDatabasePath(connection As OleDbConnection, tableName As String) As String
        Dim dbPath As String = ""
        Dim dbEngine As New DBEngine() ' DAO DBEngine kullanımı
        Dim db As Database = dbEngine.OpenDatabase(connection.DataSource) ' Veritabanını aç
        For Each tableDef As TableDef In db.TableDefs
            If tableDef.Name = tableName Then
                dbPath = tableDef.Connect
                Exit For
            End If
        Next
        db.Close()
        Return dbPath
    End Function

Son Düzenleme: 29/02/2024, 16:27, Düzenleyen: umutakkaya.
Cevapla
#12
Kod:
Private Function ConvertLinkedTableToTable(connection As OleDbConnection, tableName As String) As Table
    Dim dbEngine As New DBEngine() ' DAO DBEngine usage
    Dim db As Database = dbEngine.OpenDatabase(connection.DataSource) ' DB’yi aç
    Dim linkedTable As TableDef = Nothing
    For Each tableDef As TableDef In db.TableDefs
        If tableDef.Name = tableName Then
            linkedTable = tableDef
            Exit For
        End If
    Next

    If linkedTable IsNot Nothing Then
        Dim linkedTableDef As TableDef = db.CreateTableDef(linkedTable.Name, linkedTable.SourceTableName, linkedTable.Connect)        ' Bağlantılı tablonun tanımını al
        db.TableDefs.Append(linkedTableDef)        ' Yeni tablo tanımını DB’ye ekleme
        db.TableDefs.Refresh()        ' TableDefs’i yenile
        db.TableDefs.Delete(linkedTable.Name)        ' (İsteğe bağlı) Bağlantılı tabloyu sil
    End If
    db.Close()
    Return db.TableDefs(tableName)
End Function

kodu tabloyu bağlı topladan çıkartır tabloya dönüştürür
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da
Task