Quary1.SQL.Add(Delete from Table Hatasını çözemedim?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Quary1.SQL.Add(Delete from Table Hatasını çözemedim?

Mesaj gönderen Berdem »

Kod: Tümünü seç

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Dm.tanim.Prepare;
Dm.tanim.Close;
Dm.tanim.SQL.Clear;
Dm.tanim.SQL.Add('Delete from Employee where PhoneExt=250');
Dm.tanim.ExecSQL;
end;
end.
:?
Dm adında Datamodül tanim adında quary table Employee veritabanındaki
PhoneEXt 250 olanları silmek istiyorum.Yukardaki kodu yazdım.
Cannot perform this operation on an open dataset :cry:
mesajı alıyorum. :?:
Params , ParamCount , ParamByName() , ParamCheck ifadelerinin
tanımlarını ve program yazarken bu tanımları nerelerde kullanabiliriz? :oops:
Gerçektende bu konuda ayrıntılı bilgi veren web sitesi adıda olabilir. :roll:
SQL çalışıyorum ipuçları bölümünede baktım.Çözüm Bulamadım.Yardım rica ediyorum. :)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

olayın parametre ile alakası yok, SQL cümlesi de doğru zaten. Problem Prepare satırında. o satırı ExecSQL'in üstüne al, düzelir.

Merak ettiğiniz konuları Önerileriniz kısmına öneri olarak yazabilirsiniz. Fırsat buldukça burdaki isteklerle ilgili makaleler yazıp siteye ekliyorum. Diğer türlü bir Delphi kitabı edinmenizi tavsiye ederim.

Kolay gelsin.
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Tür uyuşmazlığı söylemi diye hata mesajları alıyorum.

Mesaj gönderen Berdem »

Sayın Hocam aynen dediğiniz gibi yaptım tekrar hata mesajları alıyorum.SQL ve veri tabanları kitabım var ordaki uygulamaları DBDemos aliasındaki örnekler ve delphi7 ile denemeler yaparak ayrıca web ve sizin ipuçları ve forumdaki tartışmaları izleyerek SQL öğrenmeye çalışıyorum.Ne yazık ki 3 günden bu hatada takılıp kaldım.Kendim ce bir çok denemeler yaptım.Hiç biri sonuç vermedi.Acaba nedir bu hatam herkezin başarı ile sonuçlandırdığı bu konuda benim hala takılıp kalmam.
1.Bunu Quary gerek datamodüllü gerek se datamodülsüz denedim olmadı
2.Table active ve requred true yaptım programı run etmeden table grid de gösterdim.Yani Quary Table sql select * from employee komutunuda girdim.
3.Bir çok değişik varyasyonlar denedim hata mesajlarından kurtulamadım ve öğrenme yolculuğum da takılıp kaldım.Aşağıdaki örnek kod gibi,

Kod: Tümünü seç

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
sil:integer;
mj:string;
begin
mj:=Dm.tanimFirstName.Value;
sil:=Dm.tanimEmpNo.AsInteger;
if MessageDlg('Silinecek:'+mj+#13+'Emin misiniz?', mtConfirmation , [mbYes,mbNo],0)=mrYes then
begin
Dm.tanim.Close;
Dm.tanim.SQL.Clear;
Dm.tanim.SQL.Add('DELETE from Employee where EmpNo='+IntToStr(sil));
Dm.tanim.ExecSQL;
Dm.tanim.Refresh;
end;
end;
end.
Type mismatch in expression

Kısacası yukardakine benzer ve ya benzemeyen bir çok denemem oldu..
Tür uyuşmazlığı söylemi diye hata mesajları alıyorum.Acaba DBDemos Aliasında çalışan Özellikle bu cılgın DELETE komutunda....... program örneği yayınlayabilirmisiniz...
Not:Hzr 26, 2003 8:25 Mesaj konusu: Sql ile ilişkili tablolardan kayıt silmek
Konusundaki

Kod: Tümünü seç

Query1.Close; 
Query1.SQL.Clear; 
Query1.SQL.Add('DELETE from tablo1') 
Query1.SQL.Add('where TEKLIF_NO = :Sil'); 
Query1.ParamByName ('Sil').Value := Query1.FieldByName('TEKLIF_NO').Value; 
Query1.ExecSQL; 
Denedim malesef olmadı...
En içten saygılarımla..
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

hocam bence önemli olan mantığı kavramak, sözdizimini bulmak o kadar da problem olmaz.

İlk SQL cümlesinde kayıtı siliyorsunuz ve Query'de delete ... ifadesi var. Burda Refresh komutu hatalı. Eğer 100 işçi var ve siz birini sildikten sonra kalan 99'u göstermek istiyorsanız, Refresh edeceğiniz table/Query farklı olmalı. Meslea Q_isci olabilir bunda "select * from employee" gibi bir ifade olmalı.

2. SQL ifadesinde de bir yanlışlık gözükmüyor gibi ama ben silme işlemlerinde parametre vermek yerine, ilk SQL cümlesinde olduğu gibi dinamik oluşturmayı tercih ederim.

+ Value sonucu variant olarak döndürecektir. Bu hem yavaş çalışır, hem de bazı yerlerde sıkıntı olabilir. Bunun yerine FieldByName('alan_adı').AsString, FieldByName('alan_adı').AsInteger gibi kullanın.

Kolay gelsin.
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Sonunda çözüldü....

Mesaj gönderen Berdem »

Kod: Tümünü seç

unit ornek;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TForm1 = class(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
Sil:string;
begin
Sil:=InputBox('Başlık Adı','Silinecek :','');//(Sil) adında inputbox değişkeni ayarla
Query1.Close;//Sorguyu kapat
Query1.SQL.Clear;//Sql i temizle
Query1.SQL.Add('DELETE from employee.db WHERE FirstName=:Parametre_ol');// FirstName degere parametre ata
Query1.ParamByName('Parametre_ol').AsString:=Sil;//
Query1.Prepare;
Query1.ExecSQL;

Query1.Close; //yapılan değişiklikleri izlemek için
Query1.Prepare;
Query1.SQL.Clear;
Query1.SQL.Add('Select * from employee.db');
Query1.Open;
end;



end.
Ve Quary1 Table da RequestLive ve Active Özelliğini True. Ve Datasource1 DataSet özelliğini Quary1 getirince ayrıca Quary Table sql select * from employee komutunuda girdim, olay çözümlendi. :lol:

Bu kod örneğini http://delphipage.free.fr/tutoriaux.html adında bir fransız delphi sitesinden aldım. :P
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

1. Bence bu pek uygun bir yol değil. Yani silme ve kayıt seçme Query'lerinin aynı olması. Bence bunların ayrı ayrı olmasında fayda var.

2. RequestLive'i True yapmak, sadece basit SQL cümlecikleri yer alan Query'lerde işe yarar. Diğer türlü UpdateSQL bileşeni kullanmalısınız.

Kolay gelsin.
Cevapla