Blob Alanı Update Etmek

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Blob Alanı Update Etmek

Mesaj gönderen macsonfor »

Forumda aradım yanlız herhalde kimse böyle birşeye ihtiyaç duymamış yada ben bulamadım.
Veritabanı interbase & firebird tablodaki blob alanı SQL ile nasıl update edebilirim klasik update kullanımda hata veriyor örneğin ABONE TABLOSUNDA blob alanın adı DENEME olsun

Kod: Tümünü seç

var
BLOB_ALAN : String;
begin
BLOB_ALAN := Memo1.Text
ibquery1.close;
ibquery1.sql.clear;
ibquery1.sql.add('UPDATE ABONE SET DENEME='''+BLOB_ALAN+'''');
ibquery1.open;
verdiği hata tam olarak aklımda değil ama sanırım "error convertion string" hatası veriyordu. Ama database tool olarak ibexpert veya ems araçlarında sql ile update yapılabiliyor bunun nasıl yapıldığı hakkında bir bilgisi olan varmı ?
Kolay Gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Oncelikle hatanın tam metni onemli... bunu dısında update sql kodunu dogrudan bir arac uzerinde (IBExpret, SQL Explorere vs...) calistirdiginizda update islemi ouyorsa problem bu sql cümlesini Dlephi ile dinamik olarak olusturmanızda daha doğrusu oluşturamamanızdadir..... Yani problemi lokilize edebilmiş olursunuz....
Aklima gelen ihtimal memo1 alanı icinde ' işaretinin olmasi geliyor.... bu durumda

Kod: Tümünü seç

ibquery1.sql.add('UPDATE ABONE SET DENEME='''+BLOB_ALAN+''''); 
satiri problem oluşturacaktir....

Kolay gelsin..
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Fahrettin bey öncelikle teşekkür ediyorum yanlız memo bileşeninin içerdiği karakterlerde ( ' )
karakteri yok ikinciside tam olarak verdiği hata şöyle :

Kod: Tümünü seç

Project Semerkand.exe raised exception class EIBInterBaseError with message
'conversion error from string "BLOB"'. Process Stopped. Use Step or Run To Continue.
kullandığım kod ise ;

Kod: Tümünü seç


procedure TAylikDuzelt1.cxButton2Click(Sender: TObject);
var
  Mesaj: Word;
begin
    try
      ABONEUPDATE.Close;
      ABONEUPDATE.SQL.Clear;
      ABONEUPDATE.SQL.Add('UPDATE AYLIKABONE SET');
      ABONEUPDATE.SQL.Add('ADISOYADI=''' + cxTextEdit2.Text + '''');
      ABONEUPDATE.SQL.Add(',ADRESI=''' + cxTextEdit3.Text + '''');
      ABONEUPDATE.SQL.Add(',TESLIMAT=''' + cxTextEdit4.Text + '''');
      ABONEUPDATE.SQL.Add(',MEVKI=''' + cxComboBox1.Text + '''');
      ABONEUPDATE.SQL.Add(',BASLANGIC=''' + cxDateEdit1.Text + '''');
      ABONEUPDATE.SQL.Add(',ACIKLAMA=''' + cxMemo1.Text + '''');
      ABONEUPDATE.SQL.Add('WHERE ID =''' + AylikList1.cxDBTextEdit1.DataBinding.Field.AsString + '''');
      ABONEUPDATE.ExecSQL;
      ABONEUPDATE.Transaction.CommitRetaining;
      Mesaj := Application.MessageBox('Abone Düzeltme Başarılı...', 'Uyarı', MB_ICONQUESTION + MB_OK);
    except
      ABONEUPDATE.Transaction.RollbackRetaining;
      Mesaj := Application.MessageBox('Abone Düzeltme İşlemi Başarısız...', 'Hata', MB_ICONERROR + MB_OK);
    end;
  end;

Kolay Gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

parametre ile göndermeyi denediniz mi?

Kod: Tümünü seç

      ABONEUPDATE.Close; 
      ABONEUPDATE.SQL.Clear; 
      ABONEUPDATE.SQL.Add('UPDATE AYLIKABONE SET'); 
      ABONEUPDATE.SQL.Add('ADISOYADI=:ADISOYADI'); 
      ABONEUPDATE.SQL.Add(',ADRESI=:ADRESI'); 
      ABONEUPDATE.SQL.Add(',TESLIMAT=TESLIMAT':); 
      ABONEUPDATE.SQL.Add(',MEVKI=:MEVKI'); 
      ABONEUPDATE.SQL.Add(',BASLANGIC=:BASLANGIC'); 
      ABONEUPDATE.SQL.Add(',ACIKLAMA=:ACIKLAMA'); 
      ABONEUPDATE.SQL.Add('WHERE ID =:ID');

Kod: Tümünü seç

procedure TAylikDuzelt1.cxButton2Click(Sender: TObject); 
var 
  Mesaj: Word; 
begin 
    try 
      ABONEUPDATE.Close; 
      ABONEUPDATE.SQL.PARAMS[0].ASSTRING := cxTextEdit2.Text ;
     ...
     ...
      ABONEUPDATE.SQL.PARAMS[6].ASSTRING := cxMemo1.Text;
      ABONEUPDATE.SQL.PARAMS[7].ASSTRING :=
     aylikList1.cxDBTextEdit1.DataBinding.Field.AsString;
      ABONEUPDATE.ExecSQL; 
      ABONEUPDATE.Transaction.CommitRetaining; 
      Mesaj := Application.MessageBox('Abone Düzeltme Başarılı...', 'Uyarı', MB_ICONQUESTION + MB_OK); 
    except 
      ABONEUPDATE.Transaction.RollbackRetaining; 
      Mesaj := Application.MessageBox('Abone Düzeltme İşlemi Başarısız...', 'Hata', MB_ICONERROR + MB_OK); 
    end; 
  end; 
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Sayın Sadettinpolat öncelikle sizede teşekkürlerimi iletiyorum yanlız sanırım verdiğiniz kod zaten hata verecektir ayrıca syntax hatası var
yada bana öyle geldi...
parametre ile göndermeyi denediniz mi?

Kod: Tümünü seç

 procedure TAylikDuzelt1.cxButton2Click(Sender: TObject); 
var 
  Mesaj: Word; 
begin 
    try 
      ABONEUPDATE.Close; 
      ABONEUPDATE.SQL.PARAMS[0].ASSTRING := cxTextEdit2.Text ; 
     ... 
     ... 
      ABONEUPDATE.SQL.PARAMS[6].ASSTRING := cxMemo1.Text; 
      ABONEUPDATE.SQL.PARAMS[7].ASSTRING := 
     aylikList1.cxDBTextEdit1.DataBinding.Field.AsString; 
      ABONEUPDATE.ExecSQL; 
      ABONEUPDATE.Transaction.CommitRetaining; 
      Mesaj := Application.MessageBox('Abone Düzeltme Başarılı...', 'Uyarı', MB_ICONQUESTION + MB_OK); 
    except 
      ABONEUPDATE.Transaction.RollbackRetaining; 
      Mesaj := Application.MessageBox('Abone Düzeltme İşlemi Başarısız...', 'Hata', MB_ICONERROR + MB_OK); 
    end; 
  end; 
 
sanırım syntax hatası şurda

Kod: Tümünü seç

ABONEUPDATE.SQL.PARAMS[0].ASSTRING := cxTextEdit2.Text ;
sanırım query'e parametre ataması şöyle oluyordu ;

Kod: Tümünü seç

ABONEUPDATE.PARAMS[0].ASSTRING := cxTextEdit2.Text ;
ama ne fark edecekki benim bildiğim kadarılyla bu parametre ataması sadece insert into ile yapılabilmekte.
Aslında Alternatiflerim var yanlız bu işi 1.si SQL il yapmak istiyorum 2.si'de bugün için alternatifim var ama yarın olmayabilir öyle değilmi ?Açikçası bu problemin ortadan kalkması lazım diye düşünüyorum
dikkat ediniz bütün satırlar tıkır tıkır çalışıyor sadece BLOB alan satırında hata var bu nasıl birşeydir bende anlamadım neyse ilginizden dolayı tekrar tekrar teşekkür diyorum.
Kolay Gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

syntax konusunda haklısınız. acele olarak yazdığımdan dolayı sizin kodu direkt copy/paste ederek üzerinde değiştirme yapmıştım. bence syntax hatasını giderirseniz parametreler ile bu işi halledebilirsiniz. parametrelerin inset into ile bir alakası yok, delete, update , insert into ve select gibi ifadelerin tümünde parametre kullanabilirsiniz. birçok bieleşen (ibdataset, updatesql) bu şekilde çalışır.

bence parametreleri bir deneyin...
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bana biraz garip geldi problem.... Yani BLOB alanı da update de bir problem olmamalı..... Peki gerekli SQL kodunu ilgili veritabanı aracı üzerinden çalıştırdınız mı? Boylece problemi lokalize edebiliriz... Sonra tamamen aynı kodu delphi icinden calistirip sonra da sql cümlesini runtime de crete eder adım adım ilerlemiş oluruz...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Herkese teşekkürler yanlız şimdi iyi bakın buraya ;
interbase consol'da

Kod: Tümünü seç

UPDATE AYLIKABONE SET
ID=1,
ADISOYADI='MACSONFOR',
ADRESI='DELPHI TURKIYE',
TESLIMAT='DELPHI TURKIYE',
MEVKI='PROGRAMLAMA, VERITABANI',
BASLANGIC='10.01.2005' WHERE ID =1
yapınca çok güzel oluyor
ama :

Kod: Tümünü seç

UPDATE AYLIKABONE SET
ID=1,
ADISOYADI='MACSONFOR',
ADRESI='DELPHI TURKIYE',
TESLIMAT='DELPHI TURKIYE',
MEVKI='PROGRAMLAMA, VERITABANI',
BASLANGIC='10.01.2005',
ACIKLAMA='DENEME' WHERE ID =1
"ACKILAMA" yani BLOB alan eklenince bakın hata şu şekilde :


error at line -1 conversion error from string "BLOB"

UPDATE AYLIKABONE SET
ID=1,
ADISOYADI='MACSONFOR',
ADRESI='DELPHI TURKIYE',
TESLIMAT='DELPHI TURKIYE',
MEVKI='PROGRAMLAMA, VERITABANI',
BASLANGIC='10.01.2005',
ACIKLAMA='DENEME' WHERE ID =1

bilmiyorumda benim işten iyice canım sıkıldı ne yapacağımı şaşırdım valla
bu bir bug olabilirmi çünkü interbase consol'da bile sadece blob alanı update etmeye kalktığınızda yani:

Kod: Tümünü seç

UPDATE AYLIKABONE SET ACIKLAMA='DELPHI TURKIYE' WHERE ID=1
aynı hatayı veriyor. o zaman delphide kodun yanlış olma olasılığı %0 oluyor değilmi...
Kolay Gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

firebird 1.5 ile oluşturduğum aşağıdaki yapıya sahip bir tabloda

Kod: Tümünü seç

CREATE TABLE DENEME (
    ID INTEGER NOT NULL,
    NAME VARCHAR(15),
    ACIKLAMA BLOB SUB_TYPE 0 SEGMENT SIZE 255);

Kod: Tümünü seç

alter table DENEME
add constraint PK_DENEME
primary key (ID)

Kod: Tümünü seç

CREATE GENERATOR GEN_DENEME_ID

Kod: Tümünü seç

CREATE TRIGGER DENEME_BI FOR DENEME
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF ((NEW.ID = 0) or
      (NEW.ID IS NULL)) THEN
    NEW.ID = GEN_ID(GEN_DENEME_ID,1);
END
ibQuery nesnesinin sql özelliğine yazdığım

Kod: Tümünü seç

update deneme d set d.aciklama = 'ab'
satırı execsql ile gayet başarılı bir şekilde çalıştı.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('Update Deneme d set d.Aciklama =' + QuotedStr('abc'));
  IBQuery1.ExecSQL;
  IBTransaction1.CommitRetaining;
end;

sonuçlar

Kod: Tümünü seç

ID	NAME	ACIKLAMA
2	a	abc
bu da parametreli hali.
bu şekilde bir sorun çıkmadan çalışmaları gerekir.
eğer bu şekilde yine sorun alıyorsanız ibx bileşenlerini güncellemeyi deneyebilirsiniz.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('Update Deneme d set d.Aciklama =:PRM1');
  IBQuery1.Params[0].AsString := 'deneme';
  IBQuery1.ExecSQL;
  IBTransaction1.CommitRetaining;
end;

sonuçlar

Kod: Tümünü seç

ID	NAME	ACIKLAMA
2	a	deneme
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

şuan evde değilim ama deneyecem inşaallah sorun çıkarmaz ibx bileşenlerim güncel durumda tekrar teşekkür ediyorum...
Kolay Gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Evet bakın böylece problemi lokalize ettik... Delphi tarafında uğraşmaya gerek yok... Belliki Firebird tarafında bi şeyler ters gidiyor....
Sadettinpolat arkadaşımızın önerisini denemeniz sonucu getirebilir...

Olmaz ise sıfırdan bir veritabanı oluşturarak bir tablo ouşturup deneme de yapın.
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla