TCP-Dataset

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

TCP-Dataset

Mesaj gönderen ikra »

arkadaslar tcp üzerinden veritabanina baglanmak icin bir ara sunucu yaziyorum.

tcp üzerinden selectsql'i gönderiyorum ve sunucu tarafinda bu stringi execute edip cliendataset vasitasi ile stream'a yükleyip sonucu client'e gönderiyorum.
fakat sadece selectsql ile sinirli degil. hem update, hem insert islemlerini de yapabilmek icin nasil bir yol izlemem gerektigi konusunda """iste tam böyle yapmam gerekli diyebilecegim sabit""" bir fikre sahip degilim.
gerekli tüm islemleri memtable ile gerceklestirip daha sonra clientdataset vasitasi ile stream'a kayit edip sunucuya göndersem, daha sonra bunu sunucuda tekrar memtable'ye yükleyip oradan da veritabanina mi islesem? peki böyle bir durumda verilerin degistigini, özellikle blob alanlarda nasil kontrol edebilirim? update'de timestamp yapsam, client ile sunucunun saatleri farkli olabilir.

yoksa kendi dosya türümü olusturup, veritabaninda dosya olarak mi tutsam tüm verileri? yani, fatura ve teklifler dosya olarak kayit edilecek, client dosyayi isteyecek, sunucu dosyayi gönderecek, client dosya ile olan islemini bitirdikten sonra sunucuya gönderecek, sunucu da bunu veritabanina kayit edecek.

peki satirlar arasinda arama yapmam gerekirse? örnegin bana filanca ürünün satildigi belirtilen faturalari listele dendiginde bu islem dosyalama ile mümkün olmayacak.

insanin kafasinda bin tane fikir olunca, bir tane dahi islem yapamiyor.

bana yol gösterecek, beni ikna edebilecek her türlü yardima, elestiriye, fikre ihtiyacim var.
simdiden tesekkür ederim.
kıdemsiz üye
varyemez
Üye
Mesajlar: 262
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: TCP-Dataset

Mesaj gönderen varyemez »

Datasnap diye arat. bir sürü örnekler var
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

Ilgin icin tesekkur ederim. Datasnap'i inceledim. Kendi sunucusunu kullaniyor. Ben kendi sunucumu yaziyorum. Amerikayi yeniden kesfediyorum denebilir. Tcp uzerinden tum verileri cekiyorum, sadece update ve insert kismi kaliyor. Bi sekilde cozerim insaAllah.
kıdemsiz üye
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: TCP-Dataset

Mesaj gönderen mkysoft »

offline bir sistem yapmaya çalışıyorsunuz sanırım. aradaki bir sunucuya neden ihtiyaç duyduğunuzu anlamadım. veri tabanı da sonuçta tcp/ip üzerinden haberleşiyor. yapmaya çalıştığınız yöntemin alternatifleri yanında yapmaya çalıştığınız ara sunucu yönetemininde alternatifleri vardır.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TCP-Dataset

Mesaj gönderen emin_as »

Bazı tavsiyelerde bulunayım:
1- Bu tür haberleşmelerde en önemli kısım detail tablolardır. Sadece master tablo yu degil, detail tabloları da nasıl update edebilecegini çözmen gerek.
2- Clientdataset tam bu işler için düşünülmüştür, bilgilerdeki tüm degişiklikleri silme, düzenleme ve ekleme gibi ayrı kategorilerde tutmaktadır. Clientdataset in data ve delta olmak üzere iki bilgi tutma sistemi var, birinde bilgileri tutarken digerinde degişiklikleri tutmaktadır.
3- Diğer önemli bir sorun bilgileri güncellerken ortaya çıkacak sorunları çözmektir. Örnegin senin düzenledigin bir kaydı başka bir kullanıcı silmiş olabilir, kayıt artık olmadıgı için güncelleme de yapılamayacagı kullanıcıya söylenmelidir.

Genel olarak yapmak istedigin datasnap ve clientdataset ile yapılmakta, yeni birşeyler yapacaksan bile bunları incelemende fayda var.

Eger server kısmını delphi yerine, php ile yazabilirsen çok daha esnek bir sisteme sahip olabilirsin. Php ve mysql kullanan tüm internet sunucularını verilerini tutmak için kullanabilirsin. Datasnapin en büyük eksigi bu, serverin delphi le yazılması gerekiyor, bu da hosting kısmında biraz sorunlu oluyor.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

degerli bilgileriniz icin tesekkür ederim.

aslinda online bir arasunucu yapmaya ve hazir bilesenleri kullanmaktan sakinmaya calisiyorum. arka planda neler dönüyor bilmek istiyorum.
server win2k3, clientler ise hem pc hemde ipad olacaklar.

veritabaninin adresini client'in bilmesini istemiyorum. yalnizca host ve port yazarak socket üzerinden baglanti saglanacak. tüm yetkilendirmeler sunucu üzerinden kontrol edilecek.
Clientleri teker teker kontrol edip, gerektiginde ip veya mac adreslerini banlayabilecegim.
es zamanli olarak clientler socket vasitasi ile birbirleri ile mesajlasabilecek.
clientlere bürodan mesaj gönderebilecegim. örnegin ToDo list yada gidilmesi gereken adres.
clientler gittikleri adreslerde fotograf cektiklerinde socket vasitasi ile direkt server'a gönderebilecekler ve bu resimler direkt iliskili adres altina kayit edilecekler.
gelen emailleri bir server üzerinde tutup, clientlere socket ile haber gönderecegim.

(belki ileri dönemde bir emailserver olustururum ve gelen emailleri anlik olarak yine socket vasitasi ile clientlere bildirebilirim)

mesaj islemlerini socket üzerinden sendtext seklinde gönderebiliyorum. buraya kadar hersey tamam.
fakat ayni socket üzerinden veritabani islemleri icin bir yöntem gelistirmem gerekiyor.
kıdemsiz üye
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

abiler... sorun halâ aktuel.
kod istemiyorum, yalnizca fikre ihtiyacim var.
kıdemsiz üye
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TCP-Dataset

Mesaj gönderen SimaWB »

Öncelikli tavsiyem; Amerika'yı yeniden keşfetmeyin :)

Kendi sunucu ve istemcinizi yazdığınıza göre, kendi haberleşme protokolünüze sahipsiniz demektir. Dolayısıyla istemciden gönderilen mesajları sunucunun anlayabileceği bir mesaj ID'niz olmalı. En azından ben öyle yapardım. (Halihazırda bu şekilde bir yapı kullanıyorum).
Şöyle bir yapı olabilir mesela: Tablonun yapısına göre bir record ve bu record'un ilk değişkeni de mesaj ID olabilir. Örnek:

Kod: Tümünü seç

type
TMsgRehber = record
  MsgID: integer;//mesaj içeriği ne amaçla kullanılacak? Update, Insert vs.
  RecordID: integer;//Mesaj Update mesajı ise hangi kayıt update edilecek?
  Ad: string[25];
  Soyad: string[25];
  Eposta: string[100];
end;

var mesaj: TMsgRehber;
begin
   //mesaj'ı gerektiği gibi doldurun
   TCPClient.SendBuffer(mesaj, SizeOf(mesaj));//SendBuffer yada bu tarz bir komutu olmalı TCPClient'in
end; 
Server tarafında gönderilen record'u okumakla ilgili sıkıntınız olduğunu sanmıyorum. Record'un MsgID'sine göre geri kalan işleme karar verebilirsiniz.
There's no place like 127.0.0.1
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

üstadim ellerine saglik. :bravo:
böyle bir yol izleyebilirim.

kendi protokolüm hazir sayilir. insert ve update olaylarini da ilave ettim mi olay cözülmüs olacak.
testten de gecerse bir OHHHH cekecegim Allah izin verirse.

degisik fikirleriniz var ise ve paylasirsaniz memnun olurum.
kıdemsiz üye
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TCP-Dataset

Mesaj gönderen emin_as »

Json i inceledin mi bilmiyorum, xml veya json formatı çok daha esnektir. Bu tür record yapıları kullanırsan, her veritabanı değişikliğinde sunucu ve istemciyi yeniden derlemen gerekir vs.

Paketleri json olarak gönderirsen, esnek bir şekilde verileri işleyebilirsin.

http://edn.embarcadero.com/article/40882
http://code.google.com/p/superobject/wiki/first_steps

Ayrıca tekrarlayayım, bu tür sistemlerde master-detail tablolar cansıkıcıdır, o nedenle bunu nasıl çözecegine odaklan. Veritabanı bütünlügü için gerekli önlemleri almalısın. Senin degistirdigin bir kaydı, başka bir kullanıcı silmiş olabilir. Sunucunun bunu sana bildirmesi gerekir.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: TCP-Dataset

Mesaj gönderen mkysoft »

@emin_as'a katılıyorum. XML ve JSON kullanırsan daha çabuk yol alırsın. Kullanıcıların aynı kayıtlar üzerinde işlem yapmaması için bir kilit mekanizması tasarlayabilirsin. her tablonda bir id lanı bulunsun (primary key), başka bir tabloya da kilitli kayıtları yazabilirsin. kullanıcılar insert/update yapmak istediğinde kilit tablosundan kontrol edersin.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

emin_as yazdı:Bu tür record yapıları kullanırsan, her veritabanı değişikliğinde sunucu ve istemciyi yeniden derlemen gerekir
hocam kiymetli vaktin icin tesekkür ederim.

ben direkt record kullanmayacagim.
collection gibi bir sey yazip, Add() fonksyonunu overload ederim.
hem fieldtype hemde datayi eklerim. daha sonra savetostream yapip sunucuya gönderirim.
bu sekilde sabit bir record degilde, esnek bir record tutmus olurum.

sunucu gelen bu stream'i yine ayni unit ile unpack edip verileri items lerden okur ve gerekli islemi gerceklestirir. bu simdilik isin teorik kismi.
bu konudaki fikrin nedir? pozitif mi negatif mi?


master ve detail iliskilerde dikkat etmem gerektigini yazmissin. masteri nasil update ediyorsam, detaili de ayni sekilde update ederim diye düsündüm. dikkatimi cekmek istedigin bir husus mu var?

kilit konusuna gelince, myksoft hocamin dedigi gibi bir kilit tablosu olurturabilirim. fakat burada biraz takildim. select ederken kilit atsam, baskasi select edemez. update edecegim de kesin degil. o halde kiliti hangi durumda atmak gerekir?

client'te dataset.edit ve dataset.insert'i fonksyon haline getirsem ve bu fonksyon ile sunucudan onay istesem, eger kilit yoksa kilit tablosuna bu kayit icin kilit eklese nasil olur? post isleminde de sunucu kilidi kaldirir.
kıdemsiz üye
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TCP-Dataset

Mesaj gönderen emin_as »

Clientdataset detail tabloları field gibi işleyip, master tablonun içine gömüyor, bu şekilde fazladan ugraştırmıyor.
http://edn.embarcadero.com/article/29825
Detail tabloların üzerinde durmamın nedeni, çok yogun kullanılması ve veritabanı bütünlüğü ile clientların bilgi çekerken master tablo ile detail tabloya da ihtiyaç duyması. Bir fatura kaydı çekeceksin diyelim ve bu faturada 25 tane de kalem var, iki ayrı istek gönderip, önce masteri sonra da diger 25 kalemi çekmek var, bir de tek istek gönderip, 25 tane kalemi master tabloya field gibi gömmek var. Ayrıca update ve delete ederken de bunlar işlemleri kolaylaştırıyor.

Kilit konusu beladır, dikkatli yapmak gerekir. Kullanıcı tabloya kilit attı ve değişiklige başladı, sonra bir sorun nedeniyle kiliti kaldırmadı (program kilitlendi, bilgisayar reset oldu vs), kilit kalkmadığı için diger kullanıcılar bu kaydı düzenleyemeyeek ve sorun yaşayacaklardır. Geçersiz kilitleri bul ve kaldır gibi bir çözüm yapacaksın ki bu da manuel kullanılacağı için kullanıcının canını sıkacak. Firebird bu işleri transaction ile hallediyor ve her transaction a veritabanının istediği bölümünün kopyasını veriyor, böylelikle kullanıcılar diledikleri gibi işlem yapıyorlar. Firebird komponentları (ibdac, fbplus gibi) genellikle bunu bildikleri için iki ayrı transaction kullanıyorlar, bir tanesi okuma, digeri yazma için. Program okumayı yaptıgı transaction sürekli güncel tutarken, yazma gerekince hızla bu işlemi yapıyor. Okuma yapılan transactionda kilit olmadıgı için dirty read ile sürekli kaydın güncel kopyasını gösteriyor. Sadece yazma gerekince kısa süreli bir kilitlenme yapılıyor.

http://www.ibphoenix.com/resources/docu ... ign/doc_22

Firebird un transaction olayı ta 1980 lere dayanıyor, clientdataset benzer şekilde uzun süredir geliştiriliyor. Delphinin datasnap şu anda 5. jenerasyonunda ve hala yeterli bulup, begenmeyenler var. Kısaca söylemek istedigim, bu işler göründügünden çok daha karmaşıktır. Ekran tasarımında hata yapabilirsin, programın kilitlenebilir bile, kullanıcılar bir parça anlayış gösterir, ama veritabanında ortaya çıkacak bir sorun asla kabul edilemez. Bilgilerin yanlış veya eksik kaydedilmesi o programı anında çöpe attırır.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TCP-Dataset

Mesaj gönderen ikra »

Hocam konuyu soyle toparlayayim.

1) sunucu ve istemci olmak uzere iki socketim var.

2) istemci bir collection olusturuyor ve bunun icerisine
A) dataset'in adresini
B) selectsql'i
Yaziyor ve sunucuya gonderiyor.
2.1) bu istem birden fazla tablo (master detail iliskisi) olabilecegi icin, ayni collection icerisine birden fazla adres ve selectsql yazilabiliniyor.

3) sunucu gelen bu paketi unpack ediyor ve bir collection olusturuyor.
Collectionitem.adress : select gonderen clientdataset'in istemci bilgisayardaki adresi
Collectionitem.data : execute edilen selectsql'den donen ve stream formatinda kayit edilen data.
X adet item, x adet tablo. Bu sekilde master detail olayi tek sorguda halledilmis oluyor.

4) islemi biten collection stream'a kayit ediliyor ve istemciye gonderiliyor.

5) istemci gelen stream'i tekrar collection'a ceviriyor ve itemlerini okumaya basliyor.
5.1) item.adress : clientdataset
5.2) item.data : stream formatinda oldugu icin {clientdataset.loadfromstream(item.data)}

6) gelen veri grid yada db nesnelerinde gosteriliyor. Edit yada insert ediliyor. Bu anda clientdataset'in changecount sifirdan buyuk oluyor. Kullanici ya kayit tusuna basiyor, yada formu kapatirken changecount kontrol edildiginden "degisiklikler kayit edilsin mi" sorusu ile karsilasiyor.

7) dananin kuyrugunun koptugu yer! Kayit et dediginde kilit duvarina cakilip kaliyor :)

Kiliti select'te yapsam mantiksiz olur. Cunku verinin editlenecegi garanti olmadigi icin bir baskasi tarafindan bu veri kullanim disi kalacak.
Update esnasinda kilit atip islem sonunda kilidi kaldirabilirim.
O esnada istemcide bir hata olursa, muhakkak ki disconnect yada en kotu ihtimal ile 1 dakika sonra timeout devreye girecektir. Ondisconnect' te istemciye ait olan tum kilitleri sifirlayabilirim.

Teorik kismini bitirmeden pratige gecmek istemiyorum. Sonra husran ile sonuclaniyor.

Seneryo nasil yonetmenim?
kıdemsiz üye
varyemez
Üye
Mesajlar: 262
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: TCP-Dataset

Mesaj gönderen varyemez »

Bir başka senaryo da:
Bu işleri facebook ya da messenger üzerinden yapmak. İyi bir konfigurasyonla çok başarılı şekilde çalışanlar var.. Resim falan da gönderecem diyorsun.
Cevapla