Blob Alanı Update Etmek
macsonfor03.04.2005 - 18:19:49
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

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...
 
fahrettin04.04.2005 - 12:43:38
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
ibquery1.sql.add('UPDATE ABONE SET DENEME='''+BLOB_ALAN+'''');
satiri problem oluşturacaktir....

Kolay gelsin..
 
macsonfor04.04.2005 - 22:08:55
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 :

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 ;


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...
 
sadettinpolat04.04.2005 - 22:55:29
parametre ile göndermeyi denediniz mi?

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');



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;
 
macsonfor05.04.2005 - 16:44:28
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?

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

ABONEUPDATE.SQL.PARAMS[0].ASSTRING := cxTextEdit2.Text ;

sanırım query'e parametre ataması şöyle oluyordu ;

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...
 
sadettinpolat05.04.2005 - 17:29:15
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...
 
fahrettin05.04.2005 - 17:36:59
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...
 
macsonfor05.04.2005 - 18:07:53
Herkese teşekkürler yanlız şimdi iyi bakın buraya ;
interbase consol'da

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 :

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 :

:e7eb9ef34b
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:

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...
 
sadettinpolat05.04.2005 - 18:29:29
firebird 1.5 ile oluşturduğum aşağıdaki yapıya sahip bir tabloda

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


alter table DENEME
add constraint PK_DENEME
primary key (ID)



CREATE GENERATOR GEN_DENEME_ID




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

update deneme d set d.aciklama = 'ab'


satırı execsql ile gayet başarılı bir şekilde çalıştı.


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
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.

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
ID NAME ACIKLAMA
2 a deneme
 
macsonfor05.04.2005 - 18:50:27
şuan evde değilim ama deneyecem inşaallah sorun çıkarmaz ibx bileşenlerim güncel durumda tekrar teşekkür ediyorum...
Kolay Gelsin...
 
fahrettin06.04.2005 - 08:08:31
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.
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com