Access Veritabanında table içindeki tüm colums ları kontrol etme

Delphi .net ve .net ile ilgili konuları buraya yazabilirsiniz.
Cevapla
erbedas
Üye
Mesajlar: 14
Kayıt: 23 Tem 2018 06:34

Access Veritabanında table içindeki tüm colums ları kontrol etme

Mesaj gönderen erbedas »

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
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
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

Mesaj gönderen sabanakman »

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. - .
erbedas
Üye
Mesajlar: 14
Kayıt: 23 Tem 2018 06:34

Re: Access Veritabanında table içindeki tüm colums ları kontrol etme

Mesaj gönderen erbedas »

benim tercihime kalmadan kendi eklese olmazmı. böyle bir imkan yok mu
yusuf simsek
Ü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 gönderen yusuf simsek »

Öyle bir imkan olsaydı bize gerek kalmadan programlar kendiliğinden oluşurdu :)
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
sunye
Üye
Mesajlar: 105
Kayıt: 24 Ağu 2004 04:49
Konum: izmir

Re: Access Veritabanında table içindeki tüm colums ları kontrol etme

Mesaj gönderen sunye »

Kodu try except içinde çalıştır, hata verince döngüyü devam ettir.

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;
işlem hata verse bile mesaj vermeden döngüye devam edecektir.
Bildiğim tek şey, hiç bir şey bilmediğim.
yusuf simsek
Ü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 gönderen yusuf simsek »

yusuf simsek yazdı: 19 Ara 2018 01:25 Öyle bir imkan olsaydı bize gerek kalmadan programlar kendiliğinden oluşurdu :)
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... :oops: Sayet sizi incittiysem özür dilerim. Hakkınızı Helal Edin...

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

:idea: - Proje veritabanı yoksa yenisini oluşturur.
:idea: - Veritabanı içinde tablolardan hangisi veya hangileri yoksa onları da oluşturur.
:idea: - Tablo tanımında örneğin 50 olan text uzunluğunu 100 yaptınız diyelim, bunu otomatik olarak anlar ve düzeltir.
:idea: - 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.

Kod: Tümünü seç

const
  Tablolar: array[1..3] of string = ('Avukatlar', 'Borclar', 'Borclar_Default');
- 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ç

//-----------------------------------------------------------------------------
// 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
...
...
...
- Gerisini bu komutlar otomatik halledecektir. Yani tablo yoksa oluştur, varsa alanları sına ve eksikleri tamamla vs.

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.
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Cevapla