| macsonfor | 03.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... | |
| fahrettin | 04.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.. | |
| macsonfor | 04.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... | |
| sadettinpolat | 04.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; | |
| macsonfor | 05.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... | |
| sadettinpolat | 05.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... | |
| fahrettin | 05.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... | |
| macsonfor | 05.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... | |
| sadettinpolat | 05.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 | |
| macsonfor | 05.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... | |
| fahrettin | 06.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. | |