ado ile iki farklı veritabanındaki tabloları eşitlemek

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen forumsad »

arkadaşlar bir tablodaki verileriN tamamını alıp başka bir taploya eklemeyi yaptım

yapmak istediğim şu:

2 adet tablo var birinde 12 kayıt var diğerinde 10 kayıt var
önce tabloların kayıt sayılarını karşılaştırıyorum eğer ana tablodaki kayıt sayısı diğerinden büyükse son eklenen 2 kaydı diğer tabloya ekle
şeklinde bir çalışma yapmam lazım ama kafamda toparlayamadım

biraz yardımcı olurmusunuz

Kod: Tümünü seç

procedure TFrmVeriTabani.Button1Click(Sender: TObject);
var
  say1,say2,i:Integer;
begin
DMveriTabani.ADOQuery1.Close;
DMveriTabani.ADOquery1.SQL.Clear;
DMveriTabani.ADOQuery1.SQL.Add('select * from Oyunlar');
DMveriTabani.ADOQuery1.Open;
say1:=DMveriTabani.ADOQuery1.RecordCount;//query kayit sayisi
//ShowMessage(IntToStr(say1));


DMveriTabani.ADOQueryHost.Close;
DMveriTabani.ADOQueryHost.SQL.Clear;
DMveriTabani.ADOQueryHost.SQL.Add('select * from Oyunlar');
DMveriTabani.ADOQueryHost.Open;
say2:=DMveriTabani.ADOQueryHost.RecordCount;//query kayit sayisi
//ShowMessage(IntToStr(say2));


if say2<say1 then     //eşitle
              begin
              Db1denDb2yeKaydet;
              end;






end;

Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen greenegitim »

primary alanın var varsayıyorum mesela carikod 2 tane aynı olmaz aynı olanları aktarmayacaksın kayıtları karşılaştır aynı olanları değilde olmayanları aktaracaksın.
Mücadele güzelleştirir!
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen forumsad »

primar alanım ID olarak var

1-tablo ana kayıt sayısını al =12
2-tablo diğer kayıt sayısını al =10
3-tablo ana ID=11 kayıdını tablo diğer kaydet
4-tablo ana ID=12 kaydını tablo diğer kaydet şeklinde bir mantığı hayata geçirmem lazım ama nasıl yapacağımı bilemedim..
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen forumsad »

Kod: Tümünü seç

procedure TForm1.Button8Click(Sender: TObject);
var
  say1,say2,i:Integer;
veriler: Array[1..4] of  string;
begin
ADOQuery1.Open;
  say1:=ADOQuery1.RecordCount;
Form2.ADOQuery1.Open;
  say2:=Form2.ADOQuery1.RecordCount;
if say1=say2 then exit;
//ShowMessage(IntToStr(say1)+'-'+IntToStr(say2));
  for i:=say2+1 to say1 do
            begin
            ADOQuery1.Close;
            ADOquery1.SQL.Clear;
            ADOQuery1.SQL.Add('select * from tbldeneme where ID='+IntToStr(i));
            ADOQuery1.Open;
            veriler[1]:=ADOQuery1.FieldByName('tarih').AsString;
            veriler[2]:=ADOQuery1.FieldByName('veri1').AsString;
            veriler[3]:=ADOQuery1.FieldByName('veri2').AsString;

            Form2.ADOQuery1.Insert;
            Form2.ADOQuery1.FieldByName('tarih').AsString:=veriler[1];
            Form2.ADOQuery1.FieldByName('veri1').AsString:=veriler[2];
            Form2.ADOQuery1.FieldByName('veri2').AsString:=veriler[3];
            Form2.ADOQuery1.Post;

            end;

end;

böyle bir yöntemle eşitlemeyi başardım ama ne kadar doğru başka bir yolu varmı bilmiyorum

usataların yorumlarını bekliyorum

saygılarımla
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen conari »

İki tabloyu şu şekilde karşılaştırabilirsiniz.

Kod: Tümünü seç

INSERT INTO TABLO1 (ID, KOD, AD ), SELECT ID, KOD, AD FROM TABLO2 
 where NOT ID in ( select ID from tablo1 )
TABLO1 De olmayan ID ler.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen forumsad »

teşekkürler arkadaşlar
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen unicorn64 »

aktarım öncesinde her iki veritabanı için de bu aktarım dışında kayıt ekleme silme işlemi varsa kayıt sayılarını kontrol etmek yeterli olmayacaktır, kaynak veritabanında 11, hedef veritabanında 10 kayıt varken kaynak tarafından herhangi bir kaydın silinmesi sayıları eşitlese de verilerin birebir olduğu anlamına gelmez.

ayrıca ID alanının otomatik artan sayı olduğunu varsayarsak IDye göre kontrol her zaman doğru sonuç vermeyecektir, hataya çok musait bence...

Kod: Tümünü seç

VT1 Kayıtlar
ID   KOD   
1    K1     
2    K2 
3    K3

Kod: Tümünü seç

VT2 Kayıtlar
ID   KOD   
1    K1      
3    K4
gibi bir durum oluştuğunu varsayarsak ID alanı üzerinden aktarım istenen sonucu vermeyecektir.... daha belirgin bi alan(lar) üzerinden kontrol yapılarak daha doğru sonuç alınabilir sanırım

Kod: Tümünü seç


--sorgularda kodlama hatası olabilir ezbere yazdım

INSERT INTO VT2.TABLO (TARIH,VERI1,VERI2)
SELECT T1.TARIH,T1.VERI1,T1.VERI2 FROM VT1.TABLO T1
WHERE NOT EXISTS(SELECT ID FROM VT2.TABLO T2 WHERE T1.TARIH=T2.TARIH AND T1.VERI1=T2.VERI1)

--yada

INSERT INTO VT2.TABLO (TARIH,VERI1,VERI2)
SELECT T1.TARIH,T1.VERI1,T1.VERI2 FROM VT1.TABLO T1
LEFT OUTER JOIN VT2.TABLO T2 ON T1.TARIH=T2.TARIH AND T1.VERI1=T2.VERI1
WHERE T2.TARIH IS NULL
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: ado ile iki farklı veritabanındaki tabloları eşitlemek

Mesaj gönderen forumsad »

aslında belirli zamanlarda veritabanlarını eşitleyen bir kompenant olsa ne iyi olurdu delphide batchMove diye bir şey bu işi delphi için yapıyormuş

c# veya c#asp için böyle bir sınıf var mı acaba?

teşekkürler
Cevapla