Arkdaşlar
Access Veritabanında table içindeki tüm kolon ları kontrol etme
adoauery içinde
kontrol.SQL.Clear;
kontrol.SQL.Add('ALTER TABLE personel1 ADD personel_no2 Short Text');
kontrol.ExecSQL;
ikinci kolon yapınca hata alıyor.
ve her işlemde mesaj vermesine gerek yok. gerekeni açsın
veya düzeltsin. en son bitti desin. yardımcı olabilecek biri var mı lütfen
Access Veritabanında table içindeki tüm colums ları kontrol etme
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Access Veritabanında table içindeki tüm colums ları kontrol etme
try-except içine alarak hatayı susturabilirsiniz ama bu pek şık olmayabilir. Connection bileşeninde GetFieldNames('TabloAdi', StringListDegiskeni); metodunu kullanarak o tablonun alanlarını bir listeye çekerek ekleyeceğiniz alan var mı yok mu kontrol ederek ona göre sadece yoksa ekleyebilirsiniz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Access Veritabanında table içindeki tüm colums ları kontrol etme
benim tercihime kalmadan kendi eklese olmazmı. böyle bir imkan yok mu
-
- Üye
- Mesajlar: 330
- Kayıt: 09 Mar 2004 11:18
- Konum: Konya
- İletişim:
Re: Access Veritabanında table içindeki tüm colums ları kontrol etme
Öyle bir imkan olsaydı bize gerek kalmadan programlar kendiliğinden oluşurdu 

Re: Access Veritabanında table içindeki tüm colums ları kontrol etme
Kodu try except içinde çalıştır, hata verince döngüyü devam ettir.
işlem hata verse bile mesaj vermeden döngüye devam edecektir.
Kod: Tümünü seç
while not tablo1.eof do begin
try
kontrol.active:=False;
kontrol.SQL.Clear;
kontrol.SQL.Add('ALTER TABLE personel1 ADD personel_no2 Short Text');
kontrol.ExecSQL;
except
end;
tablo1.next;
end;
Bildiğim tek şey, hiç bir şey bilmediğim.
-
- Üye
- Mesajlar: 330
- Kayıt: 09 Mar 2004 11:18
- Konum: Konya
- İletişim:
Re: Access Veritabanında table içindeki tüm colums ları kontrol etme
Mesajı yazarken neşeli ve esprili bir ortamdaydık, biraz espri olsun diye yazmıştım... Şimdi tekrar okuyunca mesajın pek hoş olmadığını farkettim...yusuf simsek yazdı: 19 Ara 2018 01:25 Öyle bir imkan olsaydı bize gerek kalmadan programlar kendiliğinden oluşurdu![]()

Konu ile ilgili biraz araştırma yaparken @mrmarman hocamın bir yorumuna denk geldim... Buradan yola çıkarak kendinize VERİTABANI - TABLO - ALAN KONTROLÜ için güzel bir modül oluşturabilirsiniz diye düşünüyorum...
mrmarman yazdı: 11 Eki 2007 09:17 Merhaba
- 46 adet tablon varmış. Sana referans olsun diye bunlardan ilk üçü için bir kurgu hazırladım.
Rapidshare linki şurada indirip deneyebilirsiniz.
// Kod ZIP paketi de güncellendi...
http://rapidshare.com/files/62731925/UY ... tabani.zip
- Proje veritabanı yoksa yenisini oluşturur.
- Veritabanı içinde tablolardan hangisi veya hangileri yoksa onları da oluşturur.
- Tablo tanımında örneğin 50 olan text uzunluğunu 100 yaptınız diyelim, bunu otomatik olarak anlar ve düzeltir.
- Mevcut verilere zarar gelmeden dinamik bir şekilde işlem yürür.
- Kabul etmek gerek kolay bir oluşum değildir. Sistemi herkes anlamayabilir. Bunu saygıyla karşılarız. Diğer yandan kavrayacak durumda olanlar için bu başlığı okuyanlardan bu konu artık iyice pekişecektir diye değerlendiriyorum. Tekrar ediyorum temel amaç tablo oluşumunu ve yönetimini olabildiğince kolaylaştırmaktır..
- Tanımını ekleyeceğin her tablonun adını şu satıra eklemen gerekiyor.- Tanımını eklediğin tablonun Trafikte yer alması için ARRAY'a eklediğin sıradaki CASE satırına da yani aşağıdaki yere de eklemen gerekiyor.Kod: Tümünü seç
const Tablolar: array[1..3] of string = ('Avukatlar', 'Borclar', 'Borclar_Default');
- Gerisini bu komutlar otomatik halledecektir. Yani tablo yoksa oluştur, varsa alanları sına ve eksikleri tamamla vs.Kod: Tümünü seç
//----------------------------------------------------------------------------- // Trafik Kontrolü... //----------------------------------------------------------------------------- procedure StrucTrafik(Tablo: string; KomutListesi: TStrings); var Sayac, idx: Integer; begin ... ... ... ... case idx of 01: // 'Avukatlar' Struc_Avukatlar(KomutListesi); 02: // 'Borclar' Struc_Borclar(KomutListesi); 03: // 'Borclar_Default' Struc_BorclarDefault(KomutListesi); end; // Case ... ... ...
Kod: Tümünü seç
Uses ComObj; Const xBaglanti = 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=%s;' + 'Jet OLEDB:Database Password=%s;'; Password = 'error'; const Tablolar: array[1..3] of string = ('Avukatlar', 'Borclar', 'Borclar_Default'); const FieldTanimiPriKey = '%s %s(%d) CONSTRAINT idxUYAP PRIMARY KEY,'; FieldTanimiPriKeyDate = '%s %s CONSTRAINT idxUYAP PRIMARY KEY,'; FieldTanimi = '%s %s(%d),'; FieldTanimiDate = '%s %s,'; Var xDBDosya : TFileName; // Motor fonksiyonlarımızın başlangıcı ....... //----------------------------------------------------------------------------- //--- Veritabanı (.mdb) oluşturma --- Procedure VeritabaniOlustur( Hedef:String ); var cat : OleVariant; begin cat := CreateOleObject('ADOX.Catalog'); // Uses ComObj If FileExists(Hedef) Then DeleteFile(Hedef); cat.Create(Format(xBaglanti, [Hedef, Password])); cat := Unassigned; // Uses Variants end; Procedure Struc_Avukatlar( Liste:TStrings ); begin With Liste do begin Clear; Add('CREATE TABLE Avukatlar ('); Add(Format(FieldTanimiPriKeyDate, ['AID', 'AutoIncrement'])); Add(Format(FieldTanimi, ['AAd', 'Text', 50])); Add(Format(FieldTanimi, ['ASoyad', 'Text', 50])); Add(Format(FieldTanimi, ['AKimlikNo', 'Text', 20])); Add(Format(FieldTanimi, ['ACinsiyet', 'Text', 10])); Add(Format(FieldTanimi, ['ASicilNo', 'Text', 20])); Add(Format(FieldTanimi, ['ABaroNo', 'Text', 50])); Add(Format(FieldTanimi, ['AVergiDairesi', 'Text', 150])); Add(Format(FieldTanimi, ['AVergiNo', 'Text', 20])); Add(Format(FieldTanimi, ['AVTipi', 'Text', 10])); Add(Format(FieldTanimi, ['ATBBNo', 'Text', 20])); Add(Format(FieldTanimi, ['AAdres', 'Text', 250])); Add(Format(FieldTanimi, ['AIl', 'Text', 20])); Add(Format(FieldTanimi, ['AIlce', 'Text', 20])); Add(Format(FieldTanimiDate, ['AKurumAvukati', 'Logical', 0])); Add(Format(FieldTanimiDate, ['ASigortali', 'Logical', 0])); Add(Format(FieldTanimiDate, ['ABorcluVekili', 'Logical', 0])); // Son virgülü silmek lazım, Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1); Add(')'); end; end; Procedure Struc_Borclar( Liste:TStrings ); begin With Liste do begin Clear; Add('CREATE TABLE Borclar ('); Add(Format(FieldTanimiPriKeyDate, ['BID', 'AutoIncrement'])); Add(Format(FieldTanimiDate, ['BTakipID', 'Integer', 0 ])); Add(Format(FieldTanimi, ['BSebep', 'Text', 50 ])); Add(Format(FieldTanimiDate, ['BVadeTarih', 'Date', 0 ])); Add(Format(FieldTanimiDate, ['BGercekTutar', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BTutar', 'Currency',0 ])); Add(Format(FieldTanimi, ['BTutarTip', 'Text', 20 ])); Add(Format(FieldTanimi, ['BFaiz1', 'Text', 50 ])); Add(Format(FieldTanimi, ['BFaiz2', 'Text', 50 ])); Add(Format(FieldTanimiDate, ['BOran1', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BOran2', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BOran3', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BOran4', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BOran5', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BOran6', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BSabit', 'Currency',0 ])); Add(Format(FieldTanimiDate, ['BAciklama', 'Memo', 0 ])); Add(Format(FieldTanimi, ['BVeri1', 'Text', 50 ])); Add(Format(FieldTanimi, ['BVeri2', 'Text', 50 ])); Add(Format(FieldTanimi, ['BVeri3', 'Text', 50 ])); Add(Format(FieldTanimi, ['BVeri4', 'Text', 50 ])); Add(Format(FieldTanimi, ['BVeri5', 'Text', 50 ])); Add(Format(FieldTanimi, ['BVeri6', 'Text', 50 ])); Add(Format(FieldTanimi, ['BOtomatik', 'Text', 2 ])); // Son virgülü silmek lazım, Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1); Add(')'); end; end; Procedure Struc_BorclarDefault( Liste:TStrings ); begin With Liste do begin Clear; Add('CREATE TABLE Borclar_Default ('); Add(Format(FieldTanimiPriKeyDate, ['BID', 'AutoIncrement'])); Add(Format(FieldTanimi, ['BT1', 'Text', 50 ])); Add(Format(FieldTanimi, ['BT2', 'Text', 50 ])); Add(Format(FieldTanimi, ['BSebep', 'Text', 50 ])); Add(Format(FieldTanimiDate, ['BVadeTarih', 'Date', 0 ])); Add(Format(FieldTanimiDate, ['BTutar', 'Currency',0 ])); Add(Format(FieldTanimi, ['BTutarTip', 'Text', 20 ])); Add(Format(FieldTanimi, ['BFaiz1', 'Text', 50 ])); Add(Format(FieldTanimi, ['BFaiz2', 'Text', 50 ])); Add(Format(FieldTanimiDate, ['BAciklama', 'Memo', 0 ])); // Son virgülü silmek lazım, Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1); Add(')'); end; end; //----------------------------------------------------------------------------- // Trafik Kontrolü... //----------------------------------------------------------------------------- procedure StrucTrafik(Tablo: string; KomutListesi: TStrings); var Sayac, idx: Integer; begin KomutListesi.Clear; idx := -1; for Sayac := 1 to High(Tablolar) do if Tablolar[Sayac] = Tablo then begin idx := Sayac; Break; end; case idx of 01: // 'Avukatlar' Struc_Avukatlar(KomutListesi); 02: // 'Borclar' Struc_Borclar(KomutListesi); 03: // 'Borclar_Default' Struc_BorclarDefault(KomutListesi); end; // Case end; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- procedure TForm1.BitBtn1Click(Sender: TObject); Var Dizin : String; begin With TOpenDialog.Create(Nil) do begin Filter := 'MDB veritabanı *.mdb|*.mdb'; If Execute then begin // elle giriş yapılırsa uzantısı girilmezse veya hatalı girilirse... // garantiye almak için uzantıyı (.mdb) olarak değiştirdik... xDBDosya := ChangeFileExt(FileName, '.mdb'); Dizin := ExtractFilePath(xDBDosya); If Length(Dizin) > 40 then Dizin := Format('%s..\..\..%s\', [ Copy(Dizin, 1, 20), Copy(Dizin, Length(Dizin)-21, 20) ]); Edit1.Text := Dizin + ExtractFileName(xDBDosya); end; Free; end; end; Procedure TabloKontrol( DBDosya:TFileName; AdoQuery1, AdoQuery2 : TAdoQuery ); // ----------------------------------------------------------------------------- // Tablo varsa eksik veya değişiklik varsa tamamla, yoksa yenisini oluştur... // İki adet TAdoQuery (AdoQuery1 ve AdoQuery2) ihtiyaç duyulur... // Birisi kontrol diğeri uygulama içindir... // AdoQuery1 EXECSQL için kullanılacak // AdoQuery2 sadece Tablo Alan listesini elde ederek kontrol için. // ----------------------------------------------------------------------------- Const // komut seti için hazırladığım format tanımlarım FieldSil = 'ALTER TABLE %s DROP %s'; FieldEkle = 'ALTER TABLE %s ADD %s %s(%d)'; FieldEkleDate = 'ALTER TABLE %s ADD %s %s'; FieldDegis = 'ALTER TABLE %s ALTER COLUMN %s %s(%d)'; FieldDegisDate = 'ALTER TABLE %s ALTER COLUMN %s %s'; Var TabloListe, Liste : TStringList; //TabloAdi : String; i, j : Integer; Alan, Tip : String; Uz : Integer; Gecici : String; begin If DBDosya = '' then begin MessageDlg('Veritabanı henüz seçilmemiş...', mtError, [mbAbort], 0); Exit; end; // 1. Aşama : Veritabanı (katalog dosya) fiziksel olarak Yoksa !!! // Yeni bir tane (.mdb) katalog create edilir... //---------------------------------------------------------------------------- If NOT FileExists(DBDosya) then VeritabaniOlustur(DBDosya); // 2.Aşama : Tablolar tek tek kontrol edilecek. // Olmayan varsa yenisi oluşturulacak... //---------------------------------------------------------------------------- If NOT AdoQuery1.Connection.Connected then begin AdoQuery1.Connection.ConnectionString := Format(xBaglanti, [DBDosya, Password]); AdoQuery1.Connection.LoginPrompt := False; end; Liste := TStringList.Create; TabloListe := TStringList.Create; // var olan Tablo listesini alıyoruz... AdoQuery1.Connection.GetTableNames( TabloListe, False ); For i := 1 to High(Tablolar) do begin StrucTrafik( Tablolar[i], Liste ); If TabloListe.IndexOf( Tablolar[i] ) < 0 then begin // Bu tablo veritabanında yok, yenisini oluşturucaz... // Yani "Create Table" olayı işleyecek... // Sayac sıradaki tablo için "Create Table" SQL text'ini Liste'ye alıyoruz. AdoQuery1.SQL.Text := Liste.Text; AdoQuery1.ExecSQL; end else begin // Tablo var ancak alan isimleri doğru mu ? Eksik gedik var mı ? Liste.Delete(0); // ilk satırı sildik. Hani Create table olanı. Liste.Delete(Liste.Count-1); // son satırı sildik. Hani parantez olanı. Liste[Liste.Count-1] := Liste[Liste.Count-1] + ','; // son satıra virgül ekliyoruz. // Bu eklenen virgül tüm satırlar tutarlı olsun diye. Çünkü parse edicez // ederken de satır sonundaki virgülden kerteriz alıcaz... // Artık elimizde alan isim ve tipleri var. // Yapılacak işlem bu satırlar String Parse edilerek // ------------------------ // 1. Eksik alan varsa eklenir. // 2. Uzunluk değişikliği yapılmışsa güncellendir. // 3. Tip değişikliği yapılmışsa ( Böyle bir durum henüz yok ) // Field Listesi için var olan Tablo boş olarak açılıyor... // AlanListe stringlist'ine aktarılıyor... AdoQuery2.SQL.Text := 'SELECT * FROM '+ Tablolar[i] +' WHERE 1=0'; AdoQuery2.Active := True; // Kontrol edilecek alanlar Liste stringlist'inden sırayla kontrol edilecek. For j := 0 to Liste.Count-1 do begin Gecici := Trim( Liste[j] ); // İlk boşluğa kadar olan kısım Alan Adı oluyor... Alan := Copy(Gecici, 1, Pos(' ', Gecici)-1); System.Delete( Gecici, 1, Length(Alan) ); Gecici := Trim(Gecici); // Parantez varsa parantezin önündeki, yoksa son virgülün önündeki Tip oluyor.... Tip := Gecici; If Copy( Tip, 1, Pos('(', Tip)-1 ) <> '' then Tip := Copy( Tip, 1, Pos('(', Tip)-1 ) else Tip := Copy( Tip, 1, Pos(',', Tip)-1 ); System.Delete( Gecici, 1, Length(Tip) ); Gecici := Trim(Gecici); // Parantez varsa parantez içeriği Uzunluk, yoksa uzunluk 0 oluyor.... If ( Gecici <> '' ) AND ( Gecici[1] = '(' ) then Uz := StrToInt(Copy(Gecici, 2, Pos(')', Gecici)-2)) else Uz := 0; // Bulduğumuz alan adını Tablodan kontrol ediyoruz... If AdoQuery2.FieldList.IndexOf(Alan) < 0 then begin // Alan yok ekliyoruz... If Uz = 0 then AdoQuery1.SQL.Text := Format(FieldEkleDate, [Tablolar[i], Alan, Tip ]) else AdoQuery1.SQL.Text := Format(FieldEkle, [Tablolar[i], Alan, Tip, Uz ]); AdoQuery1.ExecSQL; end else begin // Alan var ancak Uzunluk aynı mı ? kontrol ediyoruz. If (AdoQuery2.FieldByName(Alan).Size <> Uz) then begin If (Tip <> 'Currency') then begin // Özel bir durum var. AUTOINC bir alan olacaksa o zaman eski alanı silip // yeniden oluşturucaz yoksa sadece düzelticez.. If (UpperCase(Tip) = 'AUTOINCREMENT') then begin // Alan düşürülür, AutoInc alan baştan eklenir... // Alanı silme AdoQuery1.SQL.Text := Format(FieldSil, [Tablolar[i], Alan]); AdoQuery1.ExecSQL; // Yenisini ekleme.. If Uz = 0 then AdoQuery1.SQL.Text := Format(FieldEkleDate, [Tablolar[i], Alan, Tip ]) else AdoQuery1.SQL.Text := Format(FieldEkle, [Tablolar[i], Alan, Tip, Uz ]); AdoQuery1.ExecSQL; end else begin // Sadece Düzeltme If Uz = 0 then AdoQuery1.SQL.Text := Format(FieldDegisDate, [Tablolar[i], Alan, Tip ]) else AdoQuery1.SQL.Text := Format(FieldDegis, [Tablolar[i], Alan, Tip, Uz ]); AdoQuery1.ExecSQL; end; end; // Currency ise zaten 4 olacaktır. end; // Alan Uzunluk değişiklik kontrolü end; // Alan kontrolü bloğu end; // Alan isimleri için çalışan For döngüsü end; end; TabloListe.Free; Liste.Free; end;
- Burada da uygulaması görülüyor... Bir forma iki tane TButon bir de TEdit koydum.
Kod: Tümünü seç
procedure TForm1.FormCreate(Sender: TObject); begin AdoConnection1.LoginPrompt := False; AdoQuery1.Connection := AdoConnection1; AdoQuery2.Connection := AdoConnection1; end; procedure TForm1.BitBtn1Click(Sender: TObject); Var Dizin : String; begin With TOpenDialog.Create(Nil) do begin Filter := 'MDB veritabanı *.mdb|*.mdb'; If Execute then begin // elle giriş yapılırsa uzantısı girilmezse veya hatalı girilirse... // garantiye almak için uzantıyı (.mdb) olarak değiştirdik... xDBDosya := ChangeFileExt(FileName, '.mdb'); Dizin := ExtractFilePath(xDBDosya); If Length(Dizin) > 40 then Dizin := Format('%s..\..\..%s\', [ Copy(Dizin, 1, 20), Copy(Dizin, Length(Dizin)-21, 20) ]); Edit1.Text := Dizin + ExtractFileName(xDBDosya); end; Free; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin // Uygulama.... TabloKontrol(xDBDosya, AdoQuery1, AdoQuery2); end;
// EDIT // Düzeltme //
Tablolar string değişkeni yerine TabloAdi ifadesi olarak değiştirildi. Bu ilk örnekten dönüşüm yapıldığından unutulmuş..
viewtopic.php?t=21162&start=15
bu da orjinal başlığı,
Yardımcı olabileceğimiz bir konu olursa seve seve yardımcı olmaya hazır olduğumuzu tekrar belirtmek isterim.