Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Postgresql date alan ekleme sorunu
#1
Merhaba arkadaşlar
WebServerAplication yazmaya çalışıyorum.

Veritabanı olarak Postgresql kullanıyorum.
Veritabanında oluşturduğum procedure daki tarih alanı kayıt hatası alıyorum.

Kodlarım Şöyle

Postgresql Veritabanındaki procedure şöyle;
CREATE OR REPLACE PROCEDURE "islojistik"."yukilanekle2"("_tarih" date)
AS $BODY$BEGIN
-- Routine body goes here...

INSERT INTO "islojistik"."isler"(tarih)
   VALUES(_tarih); 


END$BODY$
 LANGUAGE plpgsql


Client kodlarım

procedure TYukilanEkleF.KaydetClick(Sender: TObject);
var
 JSON: TJSONObject;
 parametre:string;
begin
 JSON := TJSONObject.Create;
 JSON.AddPair(TJSONPair.Create('tarih', FormatDateTime('YYYY-MM-DD',date)));

 AnaF.RESTAyar('YukilanEkle', JSON.ToJSON); //Burda Servera veri gönderiyoruz

Server kodlarım

procedure TWebModule1.WebModule1YukilanEkleAction(Sender: TObject;
 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
 GelenJSON:TJSONObject;
 tarih:string;
begin
if Request.MethodType<>TMethodType.mtPost then
 Handled:=False
else
begin
Response.ContentType:='text/html; charset=UTF8';
//GelenJSON yapısı
{
  "tarih":"2021-01-20",
}
GelenJSON:=TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(Request.Content),0) as TJSONObject;
 tarih      :=GelenJSON.P['tarih'].Value;
FDConnection1.Connected:=True;
try
FDStoredProc1.Close;
FDStoredProc1.StoredProcName:='yukilanekle2';
FDStoredProc1.Prepare;
FDStoredProc1.Params[0].AsString:=tarih;
FDStoredProc1.Open;
Except
 Response.Content:='0';//hata oluştur
 FDStoredProc1.Close;
 FDConnection1.Connected:=False;
end;
end;

FDStoredProc1.Params[0].AsString:=tarih;

Gelen veriyi burda hangi formata gönüştürerek veritabanına göndermeliyiz?
Cevapla
#2
Aldığın hatayı paylaşırsan yardımcı olmaya çalışırız. Ayrıca ilk bakışta gördüğüm dikkatimi çeken schema name olarak public harici "islojistik" kullanımışsın.
Aynı hatayı daha önce forumda paylaşan arkadaşımız vardı. Farklı schema name kullanılması durumunda bazı düzenlemeler yapılması gerekiyor.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#3
Server tarafında try kullandığım icin clint tarafına bi hata gelmiyor.  Veritabindaki diğer ekleme silme ve listeleme fonksiyonlarında bir problem yaşamadım farklı bir schema kullandığım icin

Sorunum şu,
- client tarafından bi tarih gonderiyorum
- gelen tarihi server da prosedürün parametresine eşitleyip prosedürü calistiriyorum.
- veritabanına giden tarih parametresi date formatında olmadigi için veritabanı hata veriyor.
Cevapla
#4
Bunun en basit kontrolü manuel olarak veri tabanına kendiniz bir tarih kayıt edin. Bakın tarih formatı nasıl. Sizde string tarih ile veri tabanında tutulan format farklı olduğu için kabul etmeyebilir. Ben genelde tarihleri string olarak '01.01.2020' gibi tutarım. Postgresde hiç bir sorun çıkmadı.

Parametre değerini AsDate veya AsDateTime şeklinde verin. String tarih bilgisinide strtodate olarak çevirin.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#5
Postgreste tarih 2020-01-01 şeklinde.

Şimdi
FDStoredProc1.Params[0].AsString:=FormatDateTime('YYYY-MM-DD',strToDate(tarih));
şeklinde gönderince Procedure deki formatı date olan tarih parametresine string gittiği için hata oluşuyor.


FDStoredProc1.Params[0].AsDate:=strToDate(tarih);
bu şekilde gönderdiğimdede 01.01.2021 şeklinde gittiği için format tan dolayı hata veriyor.

şimdi benim istediğim 2021-01-21 i date formatında procedure yollamak.
bildiğim herşeyi denedim olmuyor..
Cevapla
#6
FDQuery ile aşağıdaki şekilde tarihi kabul ediyor. ama FDStoredProc ile olmuyor.

FDQuery1.Close;
FDQuery1.SQL.Text:='INSERT INTO "islojistik"."isler"(tarih)'+
                              ' VALUES(:tarih)';
FDQuery1.ParamByName('tarih').Value      :=strToDate(tarih);
FdQuery1.Execute;
Cevapla
#7
Daha önce sizin oluşturduğunuz gibi bir yapıda kullanmadım.
CREATE OR REPLACE PROCEDURE
burada procedure yerine function olarak kullansanız. Yani fonksiyon oluştursanız herhangi bir sorun olmadan kullanabilirsiniz.
Procedure olarak kullandığınızda FDStoredProcedure prepare işleminde aşağıdaki hatayı alıyorsunuz.
---------------------------
Debugger Exception Notification
---------------------------
Project Project2.exe raised exception class EPgNativeException with message '[FireDAC][Phys][PG][libpq] HATA: "islojistik.yukilanekle2(_tarih => date)" bir prosedürdür..
Bir prosedür çağırmak için CALL kullanın.'.
---------------------------
Break   Continue   Help  
---------------------------

Başka seçenek olarak SQL olarak direkt çalıştırmalısınız. Aşağıdaki kullanım örneğinde olduğu gibi
CALL islojistik.yukilanekle2('2021-01-20');
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#8
Cevaplarınız icin çok teşekkür ederim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Postgresql de Fonksiyon Parametrelerine göre Where kısmını oluşturmak barissagir 3 403 12-12-2020, Saat: 13:00
Son Yorum: barissagir
  Postgresql Fonksiyon barissagir 2 318 27-11-2020, Saat: 14:52
Son Yorum: barissagir
  postgreSQL database oluşturma işlemi akuyumcu63 3 1.737 30-10-2019, Saat: 22:35
Son Yorum: TescilsizUzman
  PostgreSQL Veri Tabanı Erişimi için katı Güvenlik 3ddark 4 1.980 25-10-2019, Saat: 13:32
Son Yorum: dilanorkan
  postgresql de yedek alma esistem 4 1.909 24-10-2019, Saat: 18:10
Son Yorum: esistem



Konuyu Okuyanlar: 1 Ziyaretçi