MS Sql Database ile SignalR Etkileşimleri

Selamlar;

Bugüne kadar farklı birçok signalR örneği yaptık. Genelde hepsi bellirli değişikliklerden sonra clientları notify etmek üzerine kurulu idi. Bazen data’ya erişim farklı birçok kaynaktan olabilir. Mesela bir e-ticaret sitesinde servisler ile birbirinden bağımsız portallar veya iframe olarak verilen küçük reklam bannerları ile onlarca kaynaktan database editlenebilir. Bu durumlardan birinden dolayı database de oluşan  değişiklikleri diğer tüm clientlara bildirebilmek için proje bazında ayrı ayrı çözüm üretmek yerine daha database katmanında çözüme gidilmelidir. İşte böyle bir durumda neler yapabileceğimizi alttaki video’da tartışacağız.

db

screen2

Tanıtım: Aşağıda bazen clientların bilgilendirme işleminin SignalR teknolojisi kullanılarak neden database bazında yapılması gerektiğini güncel iş hayatından örneklerle açıkladık.

Sql Bazında SignalR:  Aşağıda öncelikle MS  Sql database’i bir windows services ile belli zaman aralıkları ile izlenmiş ve kayıt update durumunda ilgili signalR methodu tetiklenerek client’lara var olan değişiklik push edilmiştir. Daha sonra bu yöntemin, yani her 3 sn de bir ilgili datanın değişip değişmediğine bakılması amacı ile çekilmesinin server’a büyük bir yük getireceği düşünülmüştür. Bu yükten kurtulmak için tablo üzerine update durumu için bir trigger yazılmıştır. Bu trigger update durumunda ilgili procedure’ü execute etmektedir. Sql üzerinden GameHub classındaki refreshData() method’una erişilemez. Bu nedenle ilgili procedure yazılmış olan WebApi servisine sql’den request atmaktadır. İlgili request, WebApi servisinde GamesHub classındaki refreshData() methodunu çağırmaktadır. İlgili method da gösterilen tüm datayı tekrar çekip o anda aktif olan tüm clientlara push etmektedir. Böylece database’e sürekli gidilip değişen datanın kontrol edilmesine gerek kalmamıştır. Ancak daha sonra refreshData() methodunda hangi datanın değiştiğine bakılmaksızın tüm datanın çekilip clientlara push edilmesinin Big Data durumunda sql server’a yine çok yük getireceği tespit edilmiştir. Bu nedenle triger işleminde değişen datanın ID’si ilgili procedure’e parametre olarak gönderilmiştir. Gelen parametre procedureden WebApi servisine request yapılırken gönderilir. WebApi servisi de GameHub class’ındaki refreshData() methodun’u tetiklerken kendisine gönderilen bu ID’yi de beraberinde gönderir. Böylece refreshData method’u da bu update edilen ürünün ID’si sayesinde tüm data yerine sadece ilgili ürünü çekerek var olan listeden değiştirir.


( PartilaView) GameList.cshtml :

 Index.cshtml:

 HomeController.cs:

 Helper.cs:

 DAL:

 Windows Application – CheckGameListDB (Form1.cs):

 WebApi – CallAllClients(GamesController.cs):

Sql Procedure) callWebServices:

 Trigger(callWebServicesTrigger):

 Sql bazında WebApi Servisine Request’e İzin Verilmesi Aşağıdaki Gibidir:

sp_configure ‘show advanced options’, 1;
GO
RECONFIGURE;
GO
sp_configure ‘Ole Automation Procedures’,1
reconfigure

Bu çözüm için Çağlar Özenç‘e teşekkür ederim :)

Yukarıdaki örnek’de halen optimizasyon isteyen bir konu vardır. O da clientlara partial view’un tüm string halinin değil sadece değişen datanın json formatındaki halinin push edilmesi gerekmesidir. Bunu için Mvc RenderPartial yerine MVVM design pattern’a bağlı olarak Angular veya Knockoutjs gibi javascript frameworkleri kullanılarak bir ViewModel  yaratılmalı ve güncelenen bu data yaratılan ViewModel’de değiştirilerek clientlara yansıtılmalıdır. İsterseniz bu örneği de siz yapmaya çalışın. İlgili view kodları da yorumlar kısmına koyabilirsiniz. Takıldığınız her noktada çekinmeden soru sorabilirsiniz. Görüldüğü gibi yazılımda hiçbir zaman oldum denilmemelidir. Yazilan bir kodun herzaman daha ileriye götürülebilecek bir hali vardir. O an ki teknoloji ile olmasa da sonradan cikan yeni teknolojiler ile revize edilebilir. Bu is ayni bir müzisyene benzer. Gelismekte sınır yoktur.

Yeni bir makalede görüşmek üzere hoşçakalın.

Source Code: http://www.borakasmer.com/projects/signalRSql.rar

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

55 Cevaplar

  1. Barkın dedi ki:

    Hocam elinize sağlık. Gerçekten çok özgün ve başarılı bir yazı olmuş. Daha önce hiçbir yerde buna benzer bir yaklaşım görmedim. İlgili view için angularjs kullanmaya karar verdim; bitirince yorumlar kısmına ekliyecem. Yorumunuzu ve gerekli düzeltmelerinizi bekliyicem hocam.

    • borsoft dedi ki:

      Teşekkürler. Siz yeterki çaba gösterin. Ben kendimce gerekli her düzeltmeyi yaparım.
      İyi çalışmalar.

  2. Sinan dedi ki:

    Selamlar hocam;

    Mükemmel bir makale olmuş. Nedenleri ile herşeyi detaylıca anlatmışsınız. Bir konu için videoyu izlemeye başladım. O kadar çok bilmediğim konu varmış ki buda nasıl oluyormuş buda neymiş derken gerçek konudan uzaklaştım:) Merak ettiğim iç içe döngüde, değişen oyunu var olan listede ararken alttaki döngüye gerek varmıdır? İstenirse ilgili ID ye göre oyun linq’ ile çekemezmiydik?

    Böyle muhteşem bir kaynak yarattığınız için yine çok teşekkür ederim.
    Hoşçakalın.

    • borsoft dedi ki:

      Teşekkürler Sinan. Evet haklısın alttaki döngüye gerek olmadan da sonuca gidilebilir. Linq ile yazılabilecek 2. yöntem aşşağıdaki gibidir.
      İyi çalışmalar.
      foreach (tblGames item in data)
      {
      var item2 = oldData.FirstOrDefault(dt => dt.ID == item.ID);
      if (item2.ImageUrl != item.ImageUrl || item2.Name != item.Name ||
      item.Price != item2.Price)
      {
      oldData.Clear();
      oldData = data;
      Triger();
      break;
      }
      }

  3. Alikoç dedi ki:

    Selamlar Hocam;
    Ben bu videodan çok memnun kaldım. Ağzınıza sağlık çok açıklayıcı olmuş. Açıkçası ben bu MVVM’i tam anlamadım. Acaba siz bu view’ı angularJS ile yazıp sadece değişen oyunu json ile gönderebilirmisiniz. Benim de buna benzer yapmam gereken bir iş var. Hem en doğrusunu görmüş oluruz hem de bize referans olur hocam.

    İyi Çalışmalar.

    • borsoft dedi ki:

      Teşekkürler Alikoç;

      Tamam yazıp yayınlarım enkısa zamanda.
      Sana tavsiyem webinarlarımı izlemendir. Çok faydasını görürsün.

      Hoşçakal.

  4. Berk dedi ki:

    Öncelikle yazınız çok güzel ve Türkiye’de bu kadar detaylı anlatılan ilk yazı. Ben bu sistemi yazmıştım fakat Entity Framework ile trigger olduğu için kayıt işleminde hata veriyordu. Bunun çözümü nasıl bu konudada bilgilendirir misiniz ?

    • borsoft dedi ki:

      Selam Berk;

      Öncelikle Teşekkürler.
      Hataya gelirsek, Entity Framework ile verdiği hatayı belirtirsen daha doğru bir çözüm bulabiliriz. Ama tahminimce ya application ile sql’e bağlandığın user’ın tabloda alter yetkisi yoktur. Yada tabloda değiştirmek istediğin kolon başka bir tablo ile relationlıdır. İstersen verdiği hataya göre tekrar konuşalım.

      İyi çalışmalar.

  5. Uğur dedi ki:

    Merhabalar Hocam,

    Yine süper bir yazı. Çok teşekkür ederiz.

    Bir sorum var.

    Tablo büyükdükçe triggerda sıkıntı olur mu? Yada tam tersi trigger tabloya zarar verir mi? Bu tür tablo dinleme işlemleri için en iyi yok belki trigger’dır ama bazıları trigger kullanmanın ilerleyen zamanlarda sıkıntılar yaratabileceğiniz söylüyor. Tabloya anlık 10.000 kaydın geldiğini düşünürsek gerçektende performans konusunda ciddi sıkıntılar yaşanabilir düşünüyorum.

    Sizin bu konu hakkındaki görüşünüz nedir hocam?

  6. kadir dedi ki:

    Elinize sağlık güzel bir çalışma olmuş. Bende kurs bitirme projemde bir sayfa için veri tabanında olusan anlık degişimleri sayfa üzerinde göstermek istiyordum yaptıgınız bu calısma bana yardımcı olucak gibi insallah bir sıkıntı yaşamam :)

    • borsoft dedi ki:

      Teşekkürler Kadir,

      Umarım işine yarar.
      İyi çalışmalar.

      • kadir dedi ki:

        hocam ,yaptıgım projede Manage Nuget Packages ‘den
        Microsoft.AspNet.SignalR ile Microsoft.AspNet.SignalR.Client’i yükledim projeyi acarkenn Empty / MVC secerek olusturdum fakat sizdeki App_Start klasöru ıcındeki startup klası bende olusmadı kendınız sonradan mı ekledınız ? Yanlıs bısey yapmamak ıcın sormak ıstedım

        • borsoft dedi ki:

          Selam Kadir,

          Evet elle sonradan ekledim. Herşeyi Visual Studio’dan beklememek lazım :)

          İyi çalışmalar.

          • kadir dedi ki:

            tabı kı de tesekkurler,
            sımdı sızın yaptıgınız gıbı trgıer ve webservıs procedurunu yazıp denıcem ınsallah sıkıntı yasamam :)

  7. kadir dedi ki:

    Hocam bu Triger calısınca bende su resım lınkındekı gıbı hata verıyor bu sorunu nasıl çözebilirim ?
    http://i.hizliresim.com/aXoyjg.png

    • kadir dedi ki:

      Triger da bır sıkıntı var ama goremedım

      ALTER trigger [dbo].[WebServisiuyar] on [dbo].[SatisListesi]
      for update
      as
      declare @id int
      select @id=ID from inserted
      begin
      execute prc_WebServiseGonder @id
      end
      return

      • kadir dedi ki:

        Sizin yazdıgınız projeyi indirdim verı tabanında degısıklık yapında anında clıent tarafında degısıklık yapmıyor sayfa yenıleyınce yapıyor degısır

        • kadir dedi ki:

          Bende Triger ve webserviste sıkıntı var sanırım sizin yaptıgınız projede webservıste calısmıyor fakat wınforms ta tımer kullanarak yaptıgınız calısıyor

  8. atagun dedi ki:

    Yaptıgınız uygulamayı ındırdım fakat calısmadı ” Lock ” oldugu yere breakpoint koydum hıc gırmedı oraya uygulamayı ındırdıkten sonra extra olarak bısey yapmamız gerekıyor mu ?

    • borsoft dedi ki:

      Selam atagun,
      Sql bazındaki ayarları yapman gerkiyor. Sql tarafında triger etmen için gerekli izinleri vermen gerekiyor.

      İyi çalışmalar.

  9. atagun dedi ki:

    sp_configure ‘show advanced options’, 1;
    GO
    RECONFIGURE;
    GO
    sp_configure ‘Ole Automation Procedures’,1
    reconfigure

    yukarda soyledıgınız su kodları calıstırdım procedure calıstırınca response degerı null donuyor

    • atagun dedi ki:

      visual studiodan web servısı calıstırınca response degerı duzeldı ama lock’a gırmıyor sınır ettı benı ya :(

  10. kadir dedi ki:

    s.a hoca ben sorunu buldum :) Tabi sizin daha once yaptıgınız buna benzer Anqular ile yaptıgınız projeyi inceledikten sonra fark etttım :) proje ıcersındekı webapi servisinde kullanılan kontrolun adı ValuesController oldugu ıcın gonderilen veriyi almıyordu yenı kontroller olusturdum Games adında hepsını ıcıne kopyaladım calıstı sanırım ATAGUN ‘ de aynı problem var bu sekılde duzeltırse calısacaaktır

  11. Koray dedi ki:

    Hocam yanlışım varsa düzeltin lütfen, yaptıgınız projede yeni verileri partial view uzerine cekip clientlere göstermiyor muyuz?
    Orda yazmis oldugunuz java script kodu ne iş görüyor anlamadım o kısmı

    • borsoft dedi ki:

      Selam Koray,

      Sayfa ilk yüklenirken data çekilip partial viewlar dediğin gibi doluyor. Daha sonra databasede ilgili datalar değişince, bunu clientlara Mvc ile değil o görüdüğün scriptler ile Signalr sayesinde real time olarak gösteriyoruz. Yani o anda sayfa post olmuyor. İlgili datayı client’a real time olarak script ile basıyor. :)

      İyi çalışmalar.

  12. Oguz dedi ki:

    Hocam olusturdugunuz helper klası normal klas mı ? Ben normal klas olusturunca farklı cıkıyor da sanırım yanlıs yapıyorum yardımcı olabılırsenız sevınırım kolay gelsın ….

    • borsoft dedi ki:

      Selam Oğuz,

      Helper class’ı bildiğin class. Düz class :) View’ı, stirng’e convert eden önemli sade bir class. “GetRazorViewAsString()” adında static bir methodu var. Böylece ilgili view string olarak signalR function’a parametre olarak gönderiliyor.
      Sendeki soun nedir? Yani farklı çıkan nedir?

      İyi çalışmalar.

      • Oguz dedi ki:

        NameSpace ‘in oldugu kısım bende projeadı.Models olarak yazıyor sizde Controller olarak yazıyor ve ben 2015 visual studio kullanıyorum asp.net uygulması acıp webapi secince webapi icindeki controller bolumunde HomerController ValuesController ve sizinkınden farklı olarakta AccountController gelıyor ekstra bıseyler cıkınca tedırgın oldum acaba yanlıs mı yapıyorum dıye .

        • borsoft dedi ki:

          Selam Oguz,

          Empty bir proje yarat ve WebApi seç o zaman diğer seçenekler gelmez.

          İyi çalışmalar.

  13. kadir dedi ki:

    Hocam kolay gelsin iyi calısmalar. sizin bu projeyi uzerınde calıstıgım bıtırme projesi uzerıne uyguladım .Firstcode kullanmadan kurdum entityframeworku projeyı calıstırıp verı tabanında degısılık yapınca Helper klasında
    “var context = new HttpContextWrapper(HttpContext.Current);” oldugun yerde hata verıyor ” deger null olamaz ” dıyor bu hata ıcın bır çözüm öneriniz var mı ?

    Kolay gelsin …

  14. fırat atmaca dedi ki:

    Abi selam;

    abi uygulama benim adıma çok faydalı oldu. fakat bir sorun ile karşılaştım internettede karşılığını tam bılamadım. mssql 2008 de sorunsuz çalışıyor fakat mssql 2012’de SP_OAGetProperty bu procedürü bulamıyor. yardımcı olman mümkün mü acaba.
    iyi günler.

  15. Soner dedi ki:

    Bora hocam. Çok teşekkür ederim bu güzel video için.
    Benim bir tavsiyem, bu şekilde sürekli bir timer ile sorgulama yapmak yerine, Data Access katmanındaki update metodu çağrıldığında yapsak olmaz mı? Hatta Repository Design Patternle çok hoş olmaz mı?
    Gerçekten çok teşekkürler.

    • borsoft dedi ki:

      Selam Sonra,

      Öncelikle teşekkürler.
      Bu makalede çok büyük bir trick var. Sen onu atlamışın. Timer sadece 1 yolu. Ve bence gerek yok:) Esas yol Sql’de trigger var. Tabloda değişiklik olunca Sql Trigger GamesController adındaki web services’ine call yapıyor. O da signalR GamesHub ‘ı çağrıyor ve ilgili data yı client’a real time gösteriyor. Bir de bunu dene :)

      İyi çalışmalar.

  16. Mehmet UÇMAZ dedi ki:

    Bora hocam çok teşekkür ederim blogunuzdan fazlasıyla istifade ediyorum ve oldukça faydalı güzel bir konu;

    burada yaptığınız anlatım üzerinden farklı bir çalışma yapmak için uğraşıyorum uygulamada karşılaştığım bir hata konusunda yönlendirmenize ihtiyacım var.

    ” Zaman uyumsuz bir modül veya işleyici, zaman uyumsuz işlem halen beklemedeyken tamamlandı. ” gibi bir hata alıyorum, bu hatanın nedeni konusunda yardımcı olurmusunuz neye ve nelere dikkat etmem gerekir.

    • borsoft dedi ki:

      Selamlar Mehmet,
      Bana mail olarak hata ekranını dönersiniz daha çok yardımcı olabilirim.

      İyi çalışmalar.

  17. Mesut dedi ki:

    Bora Hocam Selamlar,

    Harika paylaşımlarınız için öncelikle teşekkürler. Bir sorum olacaktı. Yukarıda yaptığınız gibi Sql Server’da bir tabloya kayıt eklendiğinde ve güncellendiğinde bir web servisine request yapan trigger çalıştırıyorum. Çalışmasında herhangi bir problem yok fakat tabloya veri girişini ciddi anlamda yavaşlatıyor. Tablo saniyede çok sayıda kayıt alan ve güncellenen bir tablo. Veri giriş süresini uzatan request midir? Yardımcı olabilirseniz çok memnun olurum.

    Saygılarımla…

    • borsoft dedi ki:

      Selamlar Mesut,

      Öncelikle teşekkürler.
      Veri girişi yoğun olan tablolara trigger koyma yerine, ilgili tabloyu dinleyen microservisler yazarsan performans anlamında büyük kazanç sağalayabilirsin. Yani ya Insert durumunda tablonun LastID değerini check edicen. Ya da tüm kayıt değişikliklerini ayrıca bir Quee mekanizmasına koyup, ilgili dataları bu queeden tek tek eritecen.

      İyi çalışmalar.

  18. Tansel dedi ki:

    Bora Hocam Selamlar ,

    Aynı işlemi eklenen ve silinen kayıtlar için nasıl yapabiliriz ?

    • borsoft dedi ki:

      Onlar için de ayrı ayrı yazmamız gerekiyor :) Bence onları da bu makale yardımı ile çok daha rahat bir şekilde yapabilirsiniz.

      İyi çalışmalar.

  19. arda dedi ki:

    Merhabalar, sizin projenizi indirdim proje sorunsuz çalışıyor. Fakat apinizi postman dan çağırdığımda
    “Zaman uyumsuz bir modül veya işleyici, zaman uyumsuz işlem halen beklemedeyken tamamlandı.” şeklinde hata alıyorum. Bu sorun sizden bakıp yaptığım kendi projemde de var sqlden procedure sorunsuz çalışıyor tüm clientlara push ediyor. fakat postmanden apiyi çağırdığımda bu hatayı alıyorum acaba async siz mi yapmamız gerek. Saygılar.

    • borsoft dedi ki:

      Selamlar Arda Bey,

      Async methodları monitör etmede her zaman sorun çıkar. Sync yaparsanız, Postman’de muhtemelen sorun çıkmaz. Ama siz sonradan gene SignalR için, methodu Async’e çevirin.

      İyi çalışmalar.

  20. Mustafa dedi ki:

    Merhaba,
    İnternette bir konu hakkında araştırma yaparken bu makalenizi gördüm ve çok güzel detaylıca anlatmışsınız. Yukarıdaki kodlarda bir bölüm dikkatimi çekti. Store procedure ve trigger. Benim şuan için araştırma konusu için bir fikir oluşturdu aklımda. ilk önce araştırdığım konuyu söyleyeyim. Mevcut bir veritabanın daki verileri başka bir veritabanın daki tabloya aktaracağım. bu makaleyi görünce aklıma şöyle birşey geldi. Örnek: A veritabanında tblEmployee tablom var. Bu tabloya her veri girişi yapıldığında trigger fonksiyonum tetiklensin ve onun içinde ki store procedure gitsin wep api ile b veritabanında ki tblPerson tablosuna verileri eklesin. Bu şekilde düşündüm.
    Soru 1: Acaba bu şekilde bir senaryo gerçekleştirebilir miyim ?
    Soru 2: Eğer gerçekleştirirsem web api ye sql tarafında nasıl data göndereceğim ?
    Soru 3: Bunların hiç biri gerçekleştiremezsem dinamik olarak verilerimi bir database den başka bir database deki tabloma nasıl aktarabilirim ?

    Çalışmalarınız Teşekkür Ederim.

    • borsoft dedi ki:

      Selam Mustafa,

      Güzel makale konusu:) İstersen bundan sonraki makalem bu olsun. Sana güzel bir örnek yazayım. Databaseler arasında linked kurup trigger(Update,Insert,Delete) anında diğer tabloya, Sql procedure ile(servis falan kullanmadan) bunu kolayca yapabilirsin. Ama performancedan yersin. Kısaca o tabloya anlık 50bin kayıt olsa dağılır. Eğer yükün çoksa servis yapmak hatta bir Queue mekanizması yapmak en güzeli. Bir de aktarmak istediğin data üzerinde birtakım işlemler yapıp atmak istersen servis daha da işine yarayacaktır. Sana makalesini yazıyor olacağım.

      İyi çalışmalar.

      • Mustafa dedi ki:

        Evet maalesef veri yüküm çok fazla :( Bunun için iyice araştırma yapıyorum. Benim için en iyi performans verecek senaryo yazmaya çalışıyorum. Neyse ki aktarmak istediğim veriler üzerinde işlem yapmayacağım ama bu ileri de bir gün de yapmayacağım anlamına gelmiyor. Şuan için sadece ham verileri yeni veritabanıma aktarsam yeterli :) Şimdiden sabırsızlıkla bu konuda yazacağınız makaleyi bekliyorum. Makaleyi yazdıktan sonra bir mail atarsanız sevinirim. :)

        Teşekkür Ederim.

  21. denemeyanılma dedi ki:

    Size ne kadar teşekkür etsek azdır gerçekten :) Çok büyük bir iyilik yapıyorsunuz bizimle bildiklerinizi paylaşarak. Umarım bir gün sizin gibi bildiklerimi insanlara aktarırım,hele ki Türkçe kaynakların azlığını göz önünde bulundurursak blogunuz çok değerli bu bakımdan. Emeğinize sağlık. Sizden bir ricam var ; biz proje geliştiriyoruz ama neyi eksik kalıyor hangi yönden ne eklenmeli bunlara nasıl karar vermeliyiz, vaktiniz olursa bir yazılımın genel aşamalarıyla ilgili bir yazı hazırlayabilir misiniz veya kitap önerebilir misiniz ? çok teşekkürler .

    • borsoft dedi ki:

      Selamlar,

      Öncelikle teşekkürler. Yazılımın genel aşamalarını yazmak, cidden çok kapsamlı bir konu. Üzerinde iyi çalışıp bir şeyler hazırlamak lazım.
      Elimden geleni yapacağım.

      İyi çlışmalar.

  22. denemeyanılma dedi ki:

    Merhabalar hocam,
    tekrar teşekkürler. Ben uygulamayla çalışması için konsol uygulaması yazmıştım. Twitterdan canlı tweet çekip linq aracılığıyla direk sql servera kaydediyordum. Ancak şu anda aynı tabloya trigger eklediğim için (yukarıda sizin yazdığınız triggerı after insert şeklinde düzeltip yeni eklenen verinin Idsini göndermek istiyorum), ilk tweeti çekip veritabanına kaydedeceği anda konsol uygulaması kapanıyor. Sizce ne yapmam gerekiyor ? Yardımcı olursanız çok ama çok sevinirim.

    • denemeyanılma dedi ki:

      Hocam veritabı hatasına baktığımda şu hatayı döndürüyor : System.Data.Entity.Infrastructure.DbUpdateException: inner error : The member with identity ‘response’ does not exist in the metadata collection. İçerisinde response geçen sadece örnekte kullanmış olduğumuz store procedure var hocam. oda şu şekilde :
      USE [TwitJ]
      GO
      /****** Object: StoredProcedure [dbo].[callWebServices] Script Date: 14.11.2018 15:02:18 ******/
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      ALTER PROCEDURE [dbo].[callWebServices]
      @id int
      as
      DECLARE @sUrl varchar(200)
      DECLARE @obj int
      DECLARE @response varchar(8000)

      SET @sUrl=’http://localhost:58591/api/Values?id=’+convert(varchar,@id)
      EXEC sp_OACreate ‘MSXML2.ServerXMLHttp’,@obj out
      EXEC sp_OAMethod @obj,’Open’,NULL,’GET’,@sUrl,false
      EXEC sp_OAMethod @obj,’send’
      EXEC SP_OAGetProperty @obj,’responseText’,@response out

      select @response [response]
      EXEC sp_OADestroy @obj

  23. kamuran engin dedi ki:

    merhaba hocam ,

    Mssql Server 2017 on Linux’ta sp configurasyonunu yukarıda verdiğiniz iki komutla yaptım . fakat tablo satırını güncellemeye calışırken ” odsole70.dll could not load ” hatası alıyorum.

    cümleler çalışırken bir hata yaşamadım.

    sp_helptext sp_OACreate yazdığımda .

    odsole70.dll döndürüyor.

    fakat http isteklerini atamıyorum.

    yardımcı olursanız sevinirim ..

  24. Mehmet dedi ki:

    çok güzel bir anlatım, tebrikler.. hocam Database First-katmanlı mimaride (1-Domain- (database bağlantsı (dapper),model ve controler) 2-API Katmanında (webapi) 3-UI Katmanında (html5-JQuery-Ajax) ile çalışırken SignalR ile databasede mesel Oyunlar
    tablosunda değişikliği nasıl dinler ve ayrı bir katmanda olan Html5 -Jquery ye nasıl push ederiz.. Saygılarımla

    • borsoft dedi ki:

      Selam Mehmet,

      Öncelikle teşekkürler. Dapper’da ilgili tabloya, yani Oyunlara “[TriggerJquery]” bir custom işaretleyici koyarsın. Tüm Insert ve Update işlemlerinin olduğu Respository’de her gelen tablonun işaretleyicisine bakarsın. [TriggerJquery] var ise ==> SignalR servisine ait methodu tetiklersin.

      İyi çalışmalar.

  25. Süphan SAVAŞ dedi ki:

    29 Aralık 2020, 20:50Hocam merhabalar sizin makalenizden yola çıkarak asp net core mvc de bir uygulama geliştirdim katmanlı mimaride siparişler listesini şu şekilde getirmekteyim ; viewcomponent tasarladım bir adet ve uygulama çalışınca viewcomponent tetikleniyor ve veritabanından ilgili siparişleri getiriyor ve ben üstünde sizin yaptığınız gibi sqldependency ile ilgili tablodan verileri çekiyorum ve onchange metodunda SignalR’ın ilgili hub’ı tetikleniyor tek bir kullanıcıda çalışıyor fakat sayfayı yenilediğim zaman sqlde bir değişiklik olduğu zaman sayfa yenileme sayısı kadar ilgili metotlar tetikleniyor ve bu durum çok kötü bir senaryo oluşturuyor ve benim uygulamamda farklı farklı userlar login olabilmekte örnek veriyorum 10 tane user aynı anda sipariş oluşturup izleme yapıyor ve bir değişiklik olduğu zaman anında görmek istiyor fakat ben bu senaryoda signalr da bunu yapamadım sizden bu konuda yardım talep ediyorum. SignalR hubda OnConnectedAsync() metodunda Context.ConnectionId’yi yakalıyorum fakat sqldependency onchange metodu tetiklendiğinde context boş geliyor ne yapacağımı bilemedim.

Uğur için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak.