SQL Server üzerinden MSAccess bağlantı hk. (Örnek Mevcut)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

SQL Server üzerinden MSAccess bağlantı hk. (Örnek Mevcut)

Mesaj gönderen mrmarman »

Merhaba.

Bir projemde MSAccess veritabanındaki alanları MSSQL ile birleştirip kullanmam gereği oldu.

- (A) makinesinde "MSSQL server 2008" kurulu ve "192.168.2.1,2301\SQLSERVER" ile ilgili katalog dosyasına bağlanıyor.
- (B) makinesinde "MSAccess" veritabanı bulunuyor. Ağ üzerinde '\\ARMAN-A200\Network Paylaşım Klasörü\' şeklinde paylaşımda
- (B) makinesindeki bu klasör "everyone" için "yazma/okuma" yapabilir olarak paylaşıma açılmış durumdadır.
- (A) makinesindeki MSSQL Sunucu ayarlarında LinkedServer için uzaktan erişim ENABLED edilmiş durumda.
- Erişim yapacak her iki (A) ve (B) makinelerdeki hem Windows'un Firewall'ı kapatılarak devreden çıkartılmış durumda hem de Virüs programlarının firewall özellikleri devre dışı bırakılmış durumdadır.
- Windows Seven kurulu her iki (A) ve (B) makinedeki UAC (kullanıcı hesabı denetimi) devre dışı bırakıldı.
- (A) makinesinde Yerel INTRANET ayarlarında "trusted" server olsun diye listeye eklendi. ( 'file://arman-a200' )
- Her iki (A) ve (B) makinede de ağ altındaki "Parola Korumalı paylaşım" devre dışı. Herkes heryerde erişebiliyor.
- Şartlar eşit olsun diye şöyle yaptım, aşağıdaki SQL kurgusunu (B) makinesinin network altındaki bu klasöre koyup (A) ve (B) iki farklı makineden aynı projeyi sırayla çalıştırıp deniyorum.

Bu şartlar sağladım ancak şöyle bir ikili durum söz konusu;
- MSSQL kurulu (A) makinede bu proje çalıştığında liste alabiliyorum,
- diğer uzak (B) makineden çalıştırınca aşağıdaki hatayı alıyorum.
Resim

Kod: Tümünü seç

Var
  Veri : String;
begin
  Veri := '\\ARMAN-A200\Network Paylaşım Klasörü\Veritabani.MDB';
  With AdoQuery1 do begin
    SQL.Clear;
    SQL.Add('SELECT P1.ID, P2.Ad, P2.Soyad  FROM Personnel P1');
    SQL.Add('LEFT JOIN');
    SQL.Add('OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',');
    SQL.Add('''Data Source='+(Veri)+';'')...Personel P2 ON (P1.RegistryNumber = P2.Sicil)');
    SQL.Add('ORDER BY Ad, Soyad');
    Active := True;
  end;
end;
Şimdi Toparlayalım :

(A) makinesinde MSSQL Server kurulu ve MSSQL veritabanı burada (Malzeme ZİMMET)
(B) makinesinde herhangi bir sunucu yüklü değil, MSAccess veritabanı burada (Aylık İŞ PLANI)
(A) makinesinden her iki veritabanına da MSSQL üzerinden JOIN edilerek erişilebiliyor.
(B) makinesinden sadece MSSQL veritabanına erişim imkanı oluyor, MSAccess veritabanına MSSQL üzerinden erişim olmayıp resimdeki hata geliyor.

- MSAccess veritabanını (A) makinesine kopyalarsam sorun kalmıyor her iki makineden de her iki veritabanı JOIN edilmiş olarak okunabiliyor. Ancak benim MSAccess veritabanını (A) makinesinde olma ihtimali yok iki farklı bağımsız projeyi birleştirecek üçüncü bir proje hazırlıyorum. Bir makine iş planı yapıyor diğer makine malzeme zimmet işlemi.

İstenenlerden sadece birisi için örnek vermek gerekirse, bir malzemenin daha önce hangi işlerde çalıştığını tespit etmek gerekiyor.

Bu bağlamda konu başlığındaki soru gündeme geliyor (internetten kaynak çok ama ben başarılı olamadım) veya ben bir yeri atlıyorum...
Kusura bakmayınız uzun oldu ama detayları mesajlarda soru - cevap yapmaya gerek kalmasın diye vermek gereği duydum.

Teşekkürler.
En son mrmarman tarafından 01 Nis 2011 08:43 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

SQL Server üzerinden MSAccess bağlantı hk. (Örnek Mevcut)

Mesaj gönderen mrmarman »

Başlığı biraz daha ilginç bir hale getireyim isterseniz. :idea:

Bir temrin proje hazırladım.
- Bu proje yi derleyip ağınız altında en az iki farklı bilgisayarın ulaşabileceği bir klasöre koyun.
- Sunucu kısmına SQL server IP'si ile virgül koyup PORT numarasını girin. Örnek : 192.168.1.33,2301\SQLEXPRESS
- Veritabanı kısmında da bu projeyi ve MDB dosyasını koyduğunuz klasörün ağ atındaki adını. örnek :

MSSQL kurulu uzak makinenin IP'sini, portunu yazıp, bir de AĞ altında tanımlı bir klasördeki MSAccess veritabanını gösteriyorsunuz. Size önce MSAccess içindeki tabloları listeliyor :
Resim

sonra da MSSQL kullanarak buna bağlanıyor.

Bir önceki soruda belirttiğim şartları sağlarsanız sorunsuz yapabiliyor. Ancak işte yapamadığı şart bana lazım. Sorum halen geçerlidir.

Delphi Proje Kaynak kodu ve örnek bir MSAccess veritabanı proje bu başlığın ekindedir. ( 72 KB )

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
    xMSSQL = 'Provider=SQLOLEDB.1;'
            +'Persist Security Info=False;'
            +'Data Source=%s;'
            +'Initial Catalog=%s;'
            +'User ID=%s;'
            +'Password=%s;'
            +'Integrated Security=SSPI;'
            ;
    xMSSQL_User = '';
    xMSSQL_Pass = '';

    xJET    ='Provider=Microsoft.Jet.OLEDB.4.0;'
            +'Data Source=%s;'
            +'Jet OLEDB:Database Password=%s;';
    xJET_Pass = '';
Var
  Veri,
  Tablo : String;
  i     : Integer;
  Liste : TStringList;
begin
  Veri := Edit2.Text;
  if NOT FileExists(Veri) then begin
      MessageDlg('MSAccess veritabanı mevcut değil.', mtError, [mbCancel], 0);
      Exit;
  end;
  AdoConnection1.Connected        := False;
  AdoConnection1.ConnectionString := Format( xJET, [Veri, xJET_Pass] );
  Liste := TStringList.Create;
  AdoConnection1.Connected   := False;
  AdoConnection1.LoginPrompt := False;
  AdoConnection1.GetTableNames( Liste, False );
  AdoConnection1.Connected   := False;
  for i := 0 to Liste.Count - 1 do Liste[i] := Format('%d.%s', [i+1, Liste[i]]);
  Tablo := '1';
  If InputQuery('Tablo No.Seçiniz', Liste.Text, Tablo) then begin
    Try
      Tablo := Liste[ StrToInt(Tablo)-1 ];
    Except
      MessageDlg('Tablo numarasını yanlış yazdınız.', mtError, [mbCancel], 0);
      Exit;
    End;
    System.Delete(Tablo, 1, Pos('.', Tablo));
  end;
  Liste.Free;

  AdoConnection1.Connected   := False;
  AdoConnection1.ConnectionString := Format( xMSSQL, [Edit1.Text, 'master', xMSSQL_User, xMSSQL_Pass ]);
  DataSource1.DataSet  := ADOQuery1;
  DBGrid1.DataSource   := DataSource1;
  With AdoQuery1 do begin
    Connection := ADOConnection1;
    SQL.Clear;
    SQL.Add('SELECT * FROM' );
    SQL.Add('OpenDataSource(''Microsoft.Jet.OLEDB.4.0'',');
    SQL.Add('''Data Source='+(Veri)+';'')...'+Tablo+'');
    Active := True;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt(Application.ExeName, '.INI') );
  INI.WriteString('ANA', 'Server', Edit1.Text);
  INI.WriteString('ANA', 'MDB',    Edit2.Text);
  INI.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt(Application.ExeName, '.INI') );
  Edit1.Text := INI.ReadString('ANA', 'Server', '');
  Edit2.Text := INI.ReadString('ANA', 'MDB', '');
  INI.Free;
end;
Dosya ekleri
MSSQL_MSAccess.rar
MSSQL üzerinden MSAccess erişimi
(71.78 KiB) 103 kere indirildi
Resim
Resim ....Resim
Cevapla