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.Object, e As System.EventArgs) Handles 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
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
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
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.
(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
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