30 Nisan 2019 Salı
.Net Core Uygulamasında Redis Cache Kullanımı
Bu yazıda Docker üzerinde bir Redis Container'ı koşturup, artından bir .Net Core Mvc projesinde nasıl kullanılacağını inceleyeceğiz. Redis (distributed cahce)' de amaç, bir web sayfası yada bir web API' dan gelen istekler olduğunda her seferinde servise ya da DB'ye gitmektense bu istekleri In Memory olarak yani ram'den karşılanması ve bu sayede performansın arttırılmasıdır.
Yazının tamamında kullanılacak teknolojiler;
- Docker
- Redis
- .Net Core
Öncelikle eğer makinamızda Docker yok ise https://www.emrakin.com/2019/04/docker-nedir-neden-kullanlr-nasl.html bu adresten Docker kurulumu hakkında bilgi edinebilirsiniz.
Docker üzerinde bir Redis Container koştumak için aşağıdaki kodu kullanalar "6379" portundan ayağa kalkması sağlanır.
docker run -d --name Redis -p 6379:6379 redis
Ben .Net Core Mvc projesinde Redis için ServiceStack kullandım. İlgili kütüphaneyi https://www.nuget.org/packages/ServiceStack.Redis.Core bu linkten inceleyebilir ve Nuget ile projenize ekleyebilirsiniz.
PM> Install-Package ServiceStack.Redis.Core
Redis'in .Net Core projesinde kullanımı için Startup.cs'de AddDistributedRedisCache() methodu ile redisserver'ın IP ve Portu'nu tanımlıyoruz.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
AddDistributedRedisCache() methodunu Startup.cs' de kullanmak için Microsoft.Extensions.Caching.Redis'i Nugetten projenize dahil etmeniz gerekiyor.
PM> Install-Package Microsoft.Extensions.Caching.Redis
Models: Models klasörü altında Person.cs adında bir sınıf oluşturuyoruz.
public class Personal
{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
Projemize RedisRepository adında bir klasör ekliyoruz. Bu klasör altında Redis'le ilgili işlemlerimizi bir interface yapı da tutacağız. RedisRepository klasörünün altında IRedisService adında bir interface oluşturuyoruz.{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
public interface IRedisService
{
List<Person> GetAll(string cachekey);
Person GetById(string cachekey);
}
{
List<Person> GetAll(string cachekey);
Person GetById(string cachekey);
}
RedisRepository klasörü altına IRedisService.cs den inheritance olmuş RedisManager.cs adında bir sınıf oluşturuyoruz.
public class RedisManager : IRedisService
{
public List<Person> GetAll(string cachekey)
{
using (IRedisClient client = new RedisClient())
{
List<Person> dataList = new List<Person>();
List<string> allKeys = client.SearchKeys(cachekey);
foreach (string key in allKeys)
{
dataList.Add(client.Get<Person>(key));
}
return dataList;
}
}
public Person GetById(int personId, string cachekey)
{
using (IRedisClient client = new RedisClient())
{
var redisdata = client.Get<Person>(cachekey);
return redisdata;
}
}
}
{
public List<Person> GetAll(string cachekey)
{
using (IRedisClient client = new RedisClient())
{
List<Person> dataList = new List<Person>();
List<string> allKeys = client.SearchKeys(cachekey);
foreach (string key in allKeys)
{
dataList.Add(client.Get<Person>(key));
}
return dataList;
}
}
public Person GetById(int personId, string cachekey)
{
using (IRedisClient client = new RedisClient())
{
var redisdata = client.Get<Person>(cachekey);
return redisdata;
}
}
}
IRedisServise ve RedisManager'ı Startup.cs'e dahil etmemiz gerekiyor.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<IRedisService, RedisManager>();
}
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<IRedisService, RedisManager>();
}
HomeController.cs/HomeController(): Öncelikle person sınıfı tipinde yeni bir kayıt oluşturup Redis cache'e atıyoruz.
- "cachedata.SetValue("Person"+personvalue.ID, personvalue);": Redis'de "Person+ID" key'ine karşılık value değeri olarak oluşturulan dataByte[] dizisi SetValue() methodu ile atıyoruz.
private readonly IRedisService _redisService;
public HomeController(IRedisService redisService)
{
_redisService = redisService;
using (IRedisClient client = new RedisClient())
{
if (client.SearchKeys("Person*").Count == 0)
{
var personvalue = new Person();
personvalue.ID = 1;
personvalue.Name = "Emrah";
personvalue.Surname = "Akın";
personvalue.Age = 40;
var cachedata = client.As<Person>();
cachedata.SetValue("Person"+personvalue.ID, personvalue);
}
}
}
public HomeController(IRedisService redisService)
{
_redisService = redisService;
using (IRedisClient client = new RedisClient())
{
if (client.SearchKeys("Person*").Count == 0)
{
var personvalue = new Person();
personvalue.ID = 1;
personvalue.Name = "Emrah";
personvalue.Surname = "Akın";
personvalue.Age = 40;
var cachedata = client.As<Person>();
cachedata.SetValue("Person"+personvalue.ID, personvalue);
}
}
}
HomController.cs/Index: Redis'e "Person" key'i ile atılan tüm verileri getirmek için "Person*" ile çağırıyoruz.
public IActionResult Index()
{
const string cacheKey = "Person*";
var redisdata = _redisService.GetAll(cacheKey);
return View(redisdata);
}
{
const string cacheKey = "Person*";
var redisdata = _redisService.GetAll(cacheKey);
return View(redisdata);
}
Index.cshtml: View modelden gelenleri ekrana yansıtıyoruz
@model IEnumerable<NetCoreRedis.Models.Person>
@{
ViewData["Title"] = "Index";
}
<table class="table">
<thead>
<tr>
<th>
ID
</th>
<th>
Name
</th>
<th>
SurName
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Surname)
</td>
<td>
@Html.ActionLink("Details", "Home", new { id = item.ID }) |
</td>
</tr>
}
</tbody>
</table>
HomeController.cs/Detail: @{
ViewData["Title"] = "Index";
}
<table class="table">
<thead>
<tr>
<th>
ID
</th>
<th>
Name
</th>
<th>
SurName
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Surname)
</td>
<td>
@Html.ActionLink("Details", "Home", new { id = item.ID }) |
</td>
</tr>
}
</tbody>
</table>
public IActionResult Detail(int Id)
{
string cacheKey = "Person"+Id;
var redisdata = _redisService.GetById(cacheKey);
return View(redisdata);
}
{
string cacheKey = "Person"+Id;
var redisdata = _redisService.GetById(cacheKey);
return View(redisdata);
}
Detail.cshtml:
@model NetCoreRedis.Models.Person
@{
ViewData["Title"] = "Detail";
}
<h3><b>Person:</b></h3>
<table class="table">
<tr>
<td>Ad:</td>
<td>@Model.Name</td>
</tr>
<tr>
<td>Soyad:</td>
<td>@Model.Surname</td>
</tr>
<tr>
<td>Yaş:</td>
<td>@Model.Age</td>
</tr>
</table>
@{
ViewData["Title"] = "Detail";
}
<h3><b>Person:</b></h3>
<table class="table">
<tr>
<td>Ad:</td>
<td>@Model.Name</td>
</tr>
<tr>
<td>Soyad:</td>
<td>@Model.Surname</td>
</tr>
<tr>
<td>Yaş:</td>
<td>@Model.Age</td>
</tr>
</table>
Docker container olarak ayaklandırdığımız Redis cache üzerinden key value'larımızı görmek için terminal ekranına aşağıdaki kodu yazdıktan sonra "Keys *" komunu kullanabilirsiniz.
docker exec -it Redis redis-cli
Projenin bitmiş haline https://github.com/emrakin/.NetCore-Redis buradan ulaşabilirsiniz.
İlgili Kaynaklar:
22 Nisan 2019 Pazartesi
Docker Nedir, Neden Kullanılır, Nasıl Kurulur, Nasıl Kullanılır?(Wordpress Kurulumu)
Kısa tanımıyla Docker; geliştirdiğiniz uygulamaları platform bağımsız bir şekilde kullanabilmenizi sağlayan "container" teknolojisidir.
Docker' ı anlayabilmek için öncelikle virtualization teknolojilerini anlamak gerektiğine inanıyorum.
Virtualization teknolojilerisinin ne olduğunu derinlemesine anlatmak yerine en kısa en basit anlatımıyla virtualization bir işletim sisteminin içerisine birden fazla işletim sistemini kurabilmektir. Yani bir Windows içerisine bir Windows daha kurmak ya da bir MacOs veya Linux kurabilmek gibi kısa, basit ama olayı anlatan bir tanımla başlamış olalım.
Peki bunu neden kullanmak isteriz?
Elinizde bir tane bilgisayar var diyelim ve bunu birden fazla kişinin kullanmasını istiyorsunuz. Her kullanıcının istediği programları kurmasını, kendi işlerini yapmalarını ve bütün bunlar olurken de birbirleriyle çakışmayacak şekilde tamamen izole edilmiş ortamlar oluşturmak istiyorsunuz.Daha sonra herhangi bir kişinin artık bu ortamı kullanmasını istemediğinizde sadece ona ayırdığınız izole edilmiş ortamı silerek bu kişi için kurduğunuz işletim sisteminin ve programların diğer kullanıcılar etkilemeden ortamdan kaldırılmasını istiyorsunuz. İşte bu isteklerinizi yapabildiğiniz teknolojin adı Virtualization Teknolojisi.
Docker'ı neden kullanmak isteriz?
Yine bir örnek üzerinden gitmemiz gerekirse bir .Net Core API projesinde datalarınızı Redis üzerinden okuyup yazdırsak daha mı iyi olur sorusuna cevap arıyorsunuz. Bunun için önce Redis'i kurmanız ve ayaklandırmamız gerekir. Peki aradığınız teknoloji Redis değilse? O zaman ya kurduğunuz Redis'i bilgisayarınızda bırakıp başka bir şeyler arayacaksınız yada Redis'i bilgisayarınızdan kaldırmaya çalışacaksınız yada bunların hiç birini yapmayıp Docker için hazırlanmış bir Redis imageını makinenizde çalıştıracak ve testlerinizi gerçekleştirdikten sonra oluşturmuş olduğunuz Docker Container'ı silip hayatınıza kaldığınız yerden devam edeceksiniz.
Docker tarihçesi ve daha detaylı bilgi için Gökhan Şengün tarafından yazılan şu yazıyı okuyabilirsiniz.
Docker'ın en temel mantığı "benim bilgisayarımda çalışan her bilgisayarda çalışır." dır.
Docker Nasıl Kurulur?
İşletim sisteminiz MacOs ise aşağıdaki linkten kurulumu yapabilirsiniz.
https://docs.docker.com/docker-for-mac/install/
İşletim sisteminiz Linux ise aşağıdaki linkten sol tarafta ki menüden kendi Linux'ınıza uygun kurulumu yapabilirsiniz.
https://docs.docker.com/install/
İşletim sisteminiz Hyper-V içeriyorsa. (Windows Pro, Enterprise vb) Aşağıdaki linkten indirip kurulumu yapabilirsiniz.
https://docs.docker.com/docker-for-windows/install/
Eğer işletim sisteminiz Windows 10'sa Docker toolbox ile kurulumu yapabilirsiniz.
https://docs.docker.com/toolbox/toolbox_install_windows/
NOT: Kurulum sonrası Docker Quickstart Terminal'i açın. Bunun öncesinde BIOS' dan VIRTUALIZATION ayarlarını Enable yapmayı unutmayın.
https://www.youtube.com/watch?v=za5eAnVVWfs
Artık kurulumu tamamladığımıza göre Docker-CLI üzerinde çalışmaya başlayabiliriz.
Docker CLI
Ben komutları Windows üzerinde çalıştırıp çıktıları sizinle paylaşacağım ancak bütün komutlar Mac OS X ve Linux sistemlerde de aynen çalışacaktır sadece çıktılar farklı olabilir.
İşletim sistemimizin terminalini açıp komutları yazmaya başlayabiliriz.
1. Öncelikle Docker kurulumumuzun doğru çalışıp çalışmadığını kontrol etmek için docker version komutunu yazalım.
C:\Users\xxx>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
Dikkat ederseniz Client (Docker CLI) kısmında windows/amd64 olan Os/Arch tipi Server (Docker Daemon) kısmında linux/amd64 olarak görünüyor. Bunun nedeni Daemon Windows içinde ki Hypervisor tarafından çalıştırılan bir Linux makinede koşuyor.
2. Artık Docker kurulumumuzun başarılı olduğunu biliyoruz o zaman DockerHub'dan ilk Docker Image'ımızı inidirip çalıştıralım.
Benim amacım Windows bir makinede Wordpress'i kurmak. Şuan benim bilgisayarımda Wordpress için gerekli hiç bir şey kurulu değil. (MySQL, Apache Server vb.).
Öncelikle bize bir MySQL birde Wordpress Image'ı gerekli.
Wordpress image: https://hub.docker.com/_/wordpress
MySQL Image: https://hub.docker.com/_/mysql
Image dosyalarını nasıl indireceğimiz ve nasıl kullanacağımız hakkında detaylı bilgiler ilgili linklerde mevcut ben sadece temel olarak bir örneklendirme yapacağım ayrıntıya girmek isteyenler ilgili linklerde ki anlatımları takip edebilirler.
docker pull mysql pull komutu ile ilgili mySQL Docker Image'ını indiriyoruz.
C:\Users\xxx>docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
27833a3ba0a5: Already exists
864c283b3c4b: Pull complete
cea281b2278b: Pull complete
8f856c14f5af: Pull complete
9c4f38c23b6f: Pull complete
1b810e1751b3: Pull complete
5479aaef3d30: Pull complete
ded8fa2e1614: Pull complete
636033ba4d2e: Pull complete
902e6010661d: Pull complete
dbe44d2bf055: Pull complete
e906385f419d: Pull complete
Digest: sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Status: Downloaded newer image for mysql:latest
Using default tag: latest
latest: Pulling from library/mysql
27833a3ba0a5: Already exists
864c283b3c4b: Pull complete
cea281b2278b: Pull complete
8f856c14f5af: Pull complete
9c4f38c23b6f: Pull complete
1b810e1751b3: Pull complete
5479aaef3d30: Pull complete
ded8fa2e1614: Pull complete
636033ba4d2e: Pull complete
902e6010661d: Pull complete
dbe44d2bf055: Pull complete
e906385f419d: Pull complete
Digest: sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Status: Downloaded newer image for mysql:latest
docker pull wordperss ile WordPress Docker Image'ını indiriyoruz.
docker images komutu ile indirdiğimiz ve kullanıma hazır Docker Image' larımızı görebilirsiniz.
Şimdi sıra geldi mySQL ve WordPress Image'larını çalıştırmaya.
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=Password1234 -d mysql --default-authentication-plugin=mysql_native_password
Bu komut ile MySQL'i çalıştırıyoruz.
docker run --name wordpress01 --link mysql01 -p 8080:80 -e WORDPRESS_DB_HOST=mysql01:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=Password1234 -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_TABLE_PREFIX=wp_ -d wordpress
Bu komut ile Wordpress'i çalıştırıyoruz.
MySQL ve Wordpress Container'larımızı çalıştırdıktan sonra docker ps komutu ile çalışan Container'larımıza göz atalım.
Bu komut ile Wordpress'i çalıştırıyoruz.
MySQL ve Wordpress Container'larımızı çalıştırdıktan sonra docker ps komutu ile çalışan Container'larımıza göz atalım.
72818047f6f4 wordpress ... 0.0.0.0:8080->80/tcp wordpress01
f3193821ad7b mysql ... 306/tcp, 33060/tcp mysql01
f3193821ad7b mysql ... 306/tcp, 33060/tcp mysql01
Görüldüğü gibi iki Container da çalışıyor. Kullandığımızdan browserdan http:localhos:8080 adresini yazarak wordpress sitemizi kurmaya başlayabiliriz.
Kaynaklar:
https://medium.com/5bayt/windows-10-home-docker-kurulumu-7bc71475558
https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/
https://www.youtube.com/watch?v=g_Q7TDsrwgo&list=PL_Z0TaFYSF3LTfMIRjPUlVoUipQA0JlL2&index=8
21 Eylül 2018 Cuma
.Net Core File Upload
.Net Core kullanarak dosyaları karşıya yüklemenin bir çok yolu vardır.Benim şimdiye kadar kullandığım en basit yol aşağıda bahsettiğim şekilde. Daha basit bir yol bulursam bu kodu güncelleyeceğim.
view (cshtml) :
<form method="post" asp-action="Upload" asp-controller="Home" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="upload"/>
</form>
controller(cs) :
Eğer Dosyayı uygulamınızda bir dizine yüklemek istiyorsanız, webroot yolunu almak için IHostingEnvironment'i kullanmalısınız.
public class HomeController : Controller
{
private readonly IHostingEnvironment _environment;
public HomeController(IHostingEnvironment environment) {_environment = environment; }
public IActionResult Upload()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Create(IFormFile Getfile)
{
string fileName = Guid.NewGuid().ToString();
if (Getfile != null)
{
var Upload = Path.Combine(_environment.WebRootPath, "Dosya Yolu",fileName);
Getfile.CopyTo(new FileStream(Upload, FileMode.Create));
}
return View();
}
}
Umarım faydalı olmuştur...
19 Temmuz 2018 Perşembe
Twilio SMS Mesajlarını E-Posta Olarak İletme (Forwarding SMS Messages to your Email Inbox)
Twilio, gelen sms mesajlarını bir mail adresine iletmenize izin veriyor. Ben örneğimde .NET Core kullandım ve örneklemeyi de .NET Core üzerinden yapacağım.
Senaryoya göre Twilio gelen Sms mesajını Webhook aracılığı ile bizim sunucumuza gönderiyor, bizde gelen Reguestler ile dilediğimiz işlemi yapıyoruz.
Webhook Nedir?
Webhook özetle HTTP callbacks'dir. Yani Web API'leri ve SaaS hizmetlerini bir arada sunan bir HTTP patterndir. Webhook çoğu yönü ile websocket'lere benzerlik gösterir. En önemli farkı ise websocket browser ile haberleşirken, webhook diğer bir uygulama sunucu (Twilio) ile haberleşir.
.NET Core Projesi ve Webhook
Örnek senaryomuzda Twilio bir Sms mesajı aldığında sunucumuz ile iletişime geçecek ve gelen mesajda ki bilgileri bize gönderecektir. Biz burada Sms üzerinden örnekleme yapacağız. Bu örnekleri Voice, Chat, Video ve diğer Twilio API'leri için de uygulayabilirsiniz.
Bir Proje Oluşturalım
Twilio'dan gelen istekleri işleyebilecek bir ASP.NET Core projesi oluşturalım. Eğer siz .NET Core yerine ASP.NET MVC üzerinden gidecekseniz MVC projesi oluşturun. Aralarında tek bir fark var ona da aşağıda değineceğim.
Ben projeye "TwilioSms" adını verdim siz istediğiniz ismi verebilirsiniz.
Eğer .NET Core kullanacaksanız ASP.NET Core 2.0 ın yüklü ve seçili olduğundan emin olun.
NuGET Packages
Projemize NuGet Paket aracılığı ile 2 tane paket yüklememiz gerekiyor. Bu yüklemeleri "Package Manager Console" yi kullanarak hızlı bir şekilde yapabiliriz.
PM> Install-Package Twilio
İkinci Paketimiz ise
- .NET Core kullanacaksanız Twilio.AspNet.Core
PM> Install-Package Twilio.AspNET.Core
- .NET Mvc kullanacaksanız Twilio.AspNet.Mvc
PM> Install-Package Twilio.AspNET.Mvc
Eğer .NET Core bir projeye Twilio.AspNET.Mvc paketini yüklerseniz yada tam tersi bir .NET Mvc projeye Twilio.AspNET.Core paketini yüklerseniz projeniziz çalışmasında hatalar oluşacaktır. Bu bakımdan hangi teknolojiyi kullanıyorsanız o paketi eklemeye dikkat edin.
Paketleri yükledikten sonra benim projemki paketler şu şekilde:
Siz bu yazıyı okduğunuzda bu paketlerin yeni versiyonları çıkmış olabilir. Benim yazıyı hazırladığım tarihte ki versiyonlar bu şekilde.
Control Oluşturulması
Oluşturduğumuz projeye yeni bir Controller ekleyeceğiz. Bunun için Projenizde ki Controller klasörüne sağ tıklayın ve sırasıyla Add -- Controllers -- MVC Controller ı tıklıyoruz.
Controller!a bir isim veriyoruz ben SmsToEmail ismini verdim.
Controller oluşturulduktan sonra Twilio' nun kullanacağı namespace leri controler ımıza ekliyoruz
using Twilio.AspNet.Common;
using Twilio.AspNet.Mvc;
using Twilio.TwiML;
Ardından, Controller sınıfımızı, Twilio dan devralabilmesi için TwilioController ile değiştiriyoruz.
public class SmsToEmailController : TwilioController
Ardından bir Action Method oluşturuyoruz. Eğer geriye bir değer döndürmek istiyorsak (Gelen mesaja otomatik cevap gibi) [HttpPost] yapısını kullanmanız gerekiyor.
[HttpPost]
public IActionResult Index()
{
string body = Request.Form["Body"];
string to = Request.Form["To"];
string from = Request.Form["From"];
//Forward Sms to Email
var message = new MailMessage();
message.To.Add(new MailAddress("kime@mail.com"));
message.From = new MailAddress("kimden@mail.com");
message.Subject = "You have received a message from " + from;
message.Body = "Message: " + body;
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
var credential = new NetworkCredential
{
UserName = "username@mail.com",
Password = "Password"
};
smtp.Credentials = credential;
smtp.Host = "mail servis smtp"; // smtp-mail.outlook.com
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.Send(message);
}
return TwiML(response);
}
Ben bu örnekte bir mail yollama kısmı yapmaya çalıştım fakat siz daha farklı yollarla da maillerinizi gönderebilirsiniz.
Örnekte görüldüğü gibi Twilio dan bize "Body, To ve From" değerleri geliyor. Bizde bu değerleri alıp mail yollama işleminde kullanıyoruz. Burada ki To ve From değerleri Twilio üzerinden birbirine Sms atan kullanıcıların numarlarıdır
string body = Request.Form["Body"]; //Mesaj içeriği
string to = Request.Form["To"]; //Kime Sms Atıldı
string from = Request.Form["From"]; //Kim Sms Attı
Proje kısmında yapacaklarımız bu kadar. Şimdi Twilio kısmında bir kaç ayar yapmamız gerekecek.
Buraya kadar okuduysanız bir Twilio numaranız vardır diye tahmin ediyorum ve bu varsayımla devam ediyorum.
Twilio'da yönlendirmek istediğimiz numara tıklıyoruz.
ve açılan sayfada Messaging kısmına aşağıda ki gibi projeyi çalıştıracağımız sunucunun adresini yazıyoruz.
Bu örnek ile ASP:NET MVC ve ASP.NET Core projelerinde Twilio ya gelen Sms Mesajını bir mail adresine yönlendirebilirsiniz. Daha fazla örnek için Twilio nun kendi sayfasını ziyaret edebilirsiniz. Twilio Tutorials Umarım işinize yarayan bir örnek olmuştur.
21 Aralık 2016 Çarşamba
ViewBag veriyi Html gibi nasıl gösteririm?
Bir projede MVC Controller dan View kısmına bir veri yollamam gerekti. Model olarak yollamaya değmeyecek ama bir o kadar da önemli bir veri.Controller kısmında ViewBag oluşturdum fakat bir türlü View kısmında bu ViewBag'i Html olarak gösteremedim. Sonra aklıma bir kod geldi.
Controller kısmı:
ViewBag.Veri = "<li><a href='#'>" + Veritabanından gelen kısım + "</a></li>";
View kısmı:
@Html.Raw(ViewBag.Veri)
Ne işimize lazım olacak demeyin benim bir işime yaradıysa sizin de illaki bir yerlerde bir işinize yarar. Atın bir köşeye kullanılacağı günü beklesin.
10 Kasım 2016 Perşembe
Yazılımcı olmak zor bu memlekette
Mesleğimi severek yapıyor(d)um. Hiç bir beklenti beklemeden sadece hoşuma gittiği ve beni daha iyi hissettirdiği için başladığım bu yolda, olayların gelişimi eğlence olarak yaptığım kod yazma eylemini benim için bir mesleğe dönüştürdü.Zaten yapmaktan ve uğraşmaktan zevk aldığım yazılım artık benim mesleğim olmuştu. Ne güzel değil mi? Mesleğimi severek ve sıkılmadan yapıyordum ve büyük zevk alıyordum. Ne saat kavramım vardı ne de mesai kavramım vardı. 10 yıl boyunca sırtımda bilgisayarla gezdim. Her gittiğim yere onu da götürdüm. Aldığım işleri elimden geldiği kadarıyla kusursuz yapmaya çalıştım. Yıllık izinlerimde neredeyse hiç ayaklarımı uzatıp aldığım iznin tadını çıkaramadım. Otelde havuz başında güneşlenirken bile kod yazdığım yada acil müdehale etmek zorunda olduğum zamanlar oldu.
Peki şimdi ne oldu? Ne oldu da bu kadar keyif alarak yaptığım mesleğimden beni soğutmaya başladı.
Bir insan her şeyden anlayamaz
Mesleki hayatım boyunca belki de en çok bundan çektim. Eğer yazılcıysanız her şeyi bilmek zorundasınız. Tasarımı, yazılımı, server kurmayı, veritabanını, seo yu aklınıza gelebilecek bilişimle işlgili herşeyi bilmek zorundasınız. İş bu kadarla kalsa yine iyi yazılım dillerinden 2-3 ünede kendinizi ifade edecek kadar bilmeniz beklenir. Performansınız çok önemli değildir ne kadar çok işi ne kadar ucuz maliyetle yaptınıza bakılır.Daha önce yaptıklarının bir önemi yokmuş
Meslekte belli bir yılım geçti, büyük ölçekli işlerin front end kısmında da back end kısmında da yer aldım.Bazı projelerde proje yöneticiliği de yaptım. Gerek daha önce yer aldığım projeler gerekse daha önce yaptığım işlerden gelen şahıs referansları ne kadar dolgun olursa olsun her başladığım yeni işte kendimi bir kez daha kanıtlamam bekleniyor. Diyelim ki kendini kanıtladınız bu seferde projenin bütün yükü omuzlarınıza biniyor. Yetmiyor projede yer alan diğer insanların nazını çekmek ve onları devamlı motive etmek asli göreviniz oluyor. Bazen o kadar saçma sapan ve alakasız sorunlarla boğuşuyor ki yapmam gereken asıl işi, keyif alarak yaptığım mesleğimi yapamaz oluyorum.Mesai saatleri diye bir kavram gerçekten var mı?
Gerçekten mesai saati diye bir kavram var sanırım. Normal insanlar mesai saatleri bittiğinde şalteri indiriyor ve bir sonra ki mesai başlama saatine kadar kendi dünyalarını yaşamaya başlıyorlar. Ben hiç bir zaman o şalteri indiremiyorum, benim şalterim hep açık ve her an çalışmaya hazır. Yazılımcıysanız bu işe sadece meslek olarak bakamazsınız bu sizin yaşama tarzınızdır. Bunca yazılımcı arkadaş ile tanıştım, mesai saatlerim şunlar diyene daha rastlamadım. Yazılım mesleğinin doğasında var çünkü bu. Gece çalışma isteği, cafe de barda aklına takılan bir sorunu çözme isteği. Uykusuz geçen geceler ardından erken gidilmesi gereken ve neden sabahın köründe uykulu gözlerle gitmek zorunda olduğunu bir türlü anlayamadığın bir mesai. Bunu kimseye anlatamazsın ve işin kötüsü gece ne kadar çalışırsan çalış sabah işe geç kaldığında bunun hiç bir önemi kalmaz. Yöneticinden o saçma sapan tribi yersin ve bu ülkede neden yöneticilerin hiç bir şeyi yönetemedikleri gerçeğiyle bir kez daha yüzleşirsin.İş yaptığın kişinin sürekli tacizi
Ailenle, arkadaşlarınla, sevgilinle konuşmadığın kadar iş vereninle konuşursun. Her gün aranırsın, her gün bir gelişme beklenir. Hatta bazısı o kadar ileri gider ki bir şeyler görmek ister back end kısımları yaptığını söylesende tatmin olmaz illa ki front end kısmını görmek ister. Çünkü çoğu kişi için işin yapılıp yapılamamasında ki asıl ölçüt fron end in ilerlemesidir, back end kısmını yazmak onları oyalamaktan başka bir şey değildir.Sırtınıza binen çok olur
İş hayatında olan dertler yetmezmiş gibi bir de ahbap çavuş ilişkileri ile uğraşırsın. Yaptığınız iş bilgisayar tabanlı olup herkesin elinin altında bir bilgisayar olmasından mıdır bilemiyorum ama haftada en az 1 kere "Ya şu bizim siteye şöyle bir şey eklenecek 2 dakikalık iş yapıver", "İşte müşterileri kayıt edeceğim basit bir arayüz istiyorum halledersin sen" gibi sana beş kuruş bile kazandırmayacak garip diyaloglar kurmak zorunda kalırsın. Ücret istersen bozulurlar ve sen bir anda para göz olarak nitelendirilirsin. Onların isteklerini yapmak için hayatından vazgeçtiğin o zaman diliminin bir önemi yoktur yani. Şimdi merak ediyorum yıllardır benden hep bir şeyler isteyen ve harcadığım zamanın karşılığında bana hiç bir şey vermeyen bu insanlar benim için yada herhangi başka bir meslektaşım için bir saatini harcarmıydı?Kafanın rahat olması nasıl bir şeydi?
Ofisten çıkıp eve gittiğinizde iş stresi bitmez. Bir yerler de arkadaşlarınızla otururken, film izlerken, sevgilinizle vakit geçirirken beyninizin arkaplanında devamlı, takıldığınız bir kod parçacığı yada algoritma yapısı döner durur. O kadar sistemsiz ve plansız projeler çıkar ki karşınıza bütün zamanınızı o işlere harcamak zorunda kalırsınız ve o işi o kadar çok kısmıyla tek başınıza mücadele edersiniz ki bir süre sonra işin tüm stresini üstünüze alırsınız.Sorun meslekte değil mesleği nerede yapmaya çalıştığında
Şuana kadar yazdığım hiçbir şey yazılım mesleğinden kaynaklanan sorunlar değil aslında. Sorun bu geleceğin mesleği olarak gösterilen işi üçüncü dünya ülkesi olan ülkemizde yapmaya çalışmak. Bu ülkenin yazılımcıya karşı öyle ön yargıları ve tuhaf dürtüleri var ki. İşi alman bir dert, işi aldın diyelim teslim etme süresince yaşadıkların tam bi tiyatro, teslim ettin diyelim parayı istemen bir dert alman başlı başına bir başarı öyküsü. "altı üstü iki kod yazıyorsun" mantığı artık yer etmiş. Benim okuduğum onca makalenin, yaptığım önce işin, uykumdan vazgeçip çalıştığım onca saatin, harcadığım zamanın insanlar gözünde ki değeri "altı üstü iki kod yazıyorsun"...İnsan severek yaptığı bir işten kaytarmaz ama...
Ben şu ana kadar hiç işinden kaytarmanın yolunu arayan yazılımcı görmedim. Bir insan zaten zorla ya da aile baskısıyla yazılımcı olamaz. Eğer bir insan yazılımcılık mesleğini seçtiyse emin olun bu mesleği sonun kadar yapar ama çevre koşulları bazen bu mesleği yapmamıza engel oluyor.Yazılımcı özgür olmalı, özgür olmalı ki üretebilsin, verimli olabilsin. İşe giriş çıkış saatleri olmamalı. Haftada belirli bir çalışma saati uygulamanız yeterli (35-45 saat arası) belki bir kısım yazılımcılar gece çok iyi kod yazıyordur veya gündüz biraz yaşayıp nefes alıp gecelemek istiyordur işinde. Bu yöntemi uygulayan global yazılım ve teknoloji firmaları enayi ya da işi bilmediklerinden değil herhalde? Verimliliği, motivasyonu ve personel sadakatini artırdığı için.
İşgücünü lütfen bir sermaye olarak görün artık. Ofisinize nasıl bakım onarım yapıyorsanız, ofisiniz nasıl taşınmaz sermaye ise, lütfen personelleri de sermaye olarak görün, bakımını, onarımını yapın, ilgilenin.
Bundan sonra ki yazacaklarım sektöre yeni girmiş yada girecek arkadaşlara.
Elinizde ki tüm imkanı zorlayın ve belli bir tecrübe kazandıktan sonra yurt dışına çıkmanın yollarını arayın.
Yıllarınızı verdiğiniz, kafa patlattığınız, bir sürü şeyden fedakarlık yaparak öğrendiğiniz bu mesleği değeri ve değerinizi bilecek bir yerde yapın.
Eğer ben yurt dışına çıkamam veya bu mesleği burada yapmak istiyorum diyorsanız kendi çevrenizi ve ağınızı güçlendirin.
Nerede çalışırssanız çalışın, ne iş yaparsanız yapın ama freelance kültürüne sahip çıkın.Freelance tarafınızı hep güçlü tutun orası ile bağınızı hiç koparmayın.
Dil konusunda katı görüşleriniz olmasın. Java, C#, Python, PHP, Asp.NET vs... Her dilin kendine göre güçlü ve zayıf olduğu kısımlar ve platformlar vardır. Takım tutar gibi dil taraftarlığı yapmayın. Bir dilde uzmanlaşın ama fanatikliğini yapmayın.
Unutmayın ki Türkiye'de önemli olan maalesef bir işin çok iyi olmsı değil bir şekilde hızlı ve ucuz hatta mümkünse bedava olması. "Ayağımı yerden kessin yeter" kafasında olan müşteriler ve işverenler bir gün sizede böyle bir yazı yazdırabilir. :)
Bu konu ile ilgili şahane bir yazıda şu link te. Mutlaka okumanızı tavsiye derim.
1 Kasım 2016 Salı
PyCharm ile Yeni Django Projesi Oluşturmak
PyCharm uygulamasını kullanarak virtualenv altında yeni bir Django projesi oluşturmak için;- Uygulama üzerinden "Create New Project” e tıklıyoruz,
- açılan pencereden sol tarafta Django’yu seçiyoruz,
- ardından projemizin yerini ve adını belirliyoruz,
- sonrasında Create VirtualEnv’i seçerek virtualenv ayar ekranına geliyoruz,

- virtualenv için isim, yer ve hangi python versionuyla çalışacağı bilgilerini belirterek OK diyoruz.

- "Enable Django admin” seçeneğinin seçili oluğundan emin olarak “Create”e basıyoruz

- Django’nun son sürümünü indirdikten sonra projemiz oluşturulur ve aşağıdaki gibi bir ekran bizi karşılar.

- Sağ üst köşedeki “Run”a basıp sonrasında alttaki 127.0.0.1:8000 linkine tıklayarak sitemizin çalışır halini görebiliriz.
- Durdurmak için ise sol alt köşedeki “Stop”’a basmanız yeterlidir.

4 Eylül 2014 Perşembe
ASP.NET Label' ın Text'i içinde Eval Kullanımı...
Biraz saçma bir başlık oldu ama anlatmak istediğim tam anlamıyla da bir Label ın Text değerini Eval ile doldurmak.<asp:Label ID="LabelID" runat="server" Text='<%#Eval("TABLO SATIRI") %>'>></asp:Label>
Bu kadar bu ne işimize lazım olacak demeyin benim bir işime yaradıysa sizin de illaki bir yerlerde bir işinize yarar. Atın bir köşeye kullanılacağı günü beklesin.
10 Nisan 2014 Perşembe
ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ
Asp.NET mimarisinin temelini oluşturan CLASS yapısını
kullanarak veri tabanı işlemlerini nasıl daha az kodla ve daha stabil
yapabiliriz bunu göreceğiz.
Mevzu ilk etapta karışık gibi görünse de projelerinizde bu
yapıyı kullanmaya başladığınızda esasında işinizi ne kadar kolaylaştırdığını ve
veri tabanı işlemlerini ne kadar hızlı yaptığınızı göreceksiniz.
Ben örneği Access veri tabanı üzerinden yapacağım ama mantığı
anladığınız takdirde zaten bütün veri tabanları için yapılacak işlemler aynı.
Hikayemizde kişileri kaydettiğimiz bir listesi olsun.
Listede Kişi Adı, Telefonu, Email adresi olsun.
Öncelikle veri tabanımızı oluşturalım ben veri tabanına “classDB”
adını vereceğim. Veri tabanını oluşturduktan sonra “Kişiler” adında bir tablo
oluşturalım. Tablonun elemanlarının “KisiID”,” KisiAdi”, “KisiTel” ve ”KisiEmail”
olduğunu varsayalım.
Veri tabanını Projeye
Ekleme
Oluşturduğumuz Web sitemize ekleyebilmek için bir App_Data
klasörüne ihtiyacımız var. Bu klasörü proje adımıza sağ tıklayarak Add > Add
ASP.NET Folder > App_Data yolunu izleyerek ekleyebiliriz.
App_Data klasörünü ekledikten sonra içine classDB (Ben
classDB vermiştim) isimli veri tabanını atıyoruz.
Veri tabanıyla olan işimiz bitti.
Şimdi bu veri tabanı üzerinde işlem yapmamızı sağlayacak Select, insert,update ve delete işlemlerini yapmamızı sağlayacak olan class ımızı oluşturacağız.
Class ın Oluşturulması
Şimdi bu veri tabanı üzerinde işlem yapmamızı sağlayacak Select, insert,update ve delete işlemlerini yapmamızı sağlayacak olan class ımızı oluşturacağız.
Class ın Oluşturulması
Asp.NET class ları App_Code klasörünün içinde tutuyor. O
bakımdan ilk önce bu dosyayı oluşturuyoruz. Yukarıda App_Data klasörü ile aynı
adımları izleyerek (Add > Add ASP.NET Folder > App_Class ) dosyamızı
ekliyoruz.
App_Code
dosyasını ekledikten sonra bu dosyaya sağ tıkjlıyoruz ve Add > Add New
Items… yolunu izleyoruz.
Açılan
pencereden Class öğesini seçiyoruz Add butonuna tıklamadan önce Class ımıza bir
isim veriyoruz ben “Baglantim.cs” dedim.
Artık
Class ımızı kodları yazmak için hazır.
Veri tabanı ve Class ımızı oluşturduktan sonra Solution Explorer kısmında bu eklediğimiz klasörleri görebiliyor olmamız lazım.
Veri tabanı ve Class ımızı oluşturduktan sonra Solution Explorer kısmında bu eklediğimiz klasörleri görebiliyor olmamız lazım.
Veri Tabanının Bağlanması
App_Data içine koyduğumuz veri tabanı üzerinde çalışabilmemiz için projemize dahil etmemiz gerekmektedir. Bunun çeşitli yolları vardır. Ben genellikle veri tabanını web.config dosyası üzerinden bağlıyorum ama siz isterseniz oluşturduğumuz Baglantim.cs içinden de bu bağlantıyı yapabilirsiniz.
App_Data içine koyduğumuz veri tabanı üzerinde çalışabilmemiz için projemize dahil etmemiz gerekmektedir. Bunun çeşitli yolları vardır. Ben genellikle veri tabanını web.config dosyası üzerinden bağlıyorum ama siz isterseniz oluşturduğumuz Baglantim.cs içinden de bu bağlantıyı yapabilirsiniz.
Web.config içine
“<connectionStrings>
<add name="baglanti" connectionString="Provider=Microsoft.jet.OLEDB.4.0 ;Data
Source=|DataDirectory|\ClassDB.mdb" providerName="System.Data.OleDb"/>
</connectionStrings>”
Şeklinde bağlantımızı tanımlıyoruz.
Class Dosyasının İçeriği
Veri tabanını bağladıktan sonra sıra class ımızı yazmaya geldi. Öncelikle clasımıza
using System.Data;
Veri tabanını bağladıktan sonra sıra class ımızı yazmaya geldi. Öncelikle clasımıza
using System.Data;
using System.Data.OleDb;
using System.Web.Configuration; // web.config içindeki bağlantıyı
alacak
bu 3 namespace i ekliyoruz. Ben Access ile çalıştığım için OleDb namespace ini ekledim siz veritabanına göre namespace i değiştirebilirsiniz.
bu 3 namespace i ekliyoruz. Ben Access ile çalıştığım için OleDb namespace ini ekledim siz veritabanına göre namespace i değiştirebilirsiniz.
Class ımıza web.config dosyasında tanımladığımızı veri tabanı bağlantısını tanımlıyoruz.
public OleDbConnection baglan()
{
string bag_str = WebConfigurationManager.ConnectionStrings["baglanti"].ConnectionString;
OleDbConnection baglanti = new OleDbConnection(bag_str);
baglanti.Open(); // baglanti connection
açıyoruz
return (baglanti); //baglanti connection döndürüyoruz
}
Kafa karıştırmamak için
çok fazla detaya girmeyeceğim sadece burada oluşturduğumuz public nesnesinin
proje boyunca ihtiyacımız olacak veri tabanı bağlantısını gerçekleştirecek
olmasını bilin yeter.
İnsert, Delete,Update İşlemleri için Fonksiyonun Oluşturulması
Bu işlemleri yapmak için ayrı ayrı fonksiyonlar oluşturmamıza gerek yok. Yazdığımız sorguyu okuyacak ve ona göre bize döndürecek bir fonksiyon bu aşamada işimizi fazlasıyla görecektir.
public int idu(string sqlcumle)
İnsert, Delete,Update İşlemleri için Fonksiyonun Oluşturulması
Bu işlemleri yapmak için ayrı ayrı fonksiyonlar oluşturmamıza gerek yok. Yazdığımız sorguyu okuyacak ve ona göre bize döndürecek bir fonksiyon bu aşamada işimizi fazlasıyla görecektir.
public int idu(string sqlcumle)
{
OleDbConnection baglan = this.baglan();
OleDbCommand sorgu = new OleDbCommand(sqlcumle, baglan);
int sonuc = 0;
try
{
sonuc = sorgu.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception(ex.Message);
}
sorgu.Dispose();
baglan.Close();
baglan.Dispose();
return (sonuc);
}
DataTable
ile İşlem Yapmak için Fonksiyonu Oluşturalım
Select işlemlerinde işimize yarayacak bu fonksiyon belki de projelerimizde en çok kullanacağımız fonksiyon bu olacak.
public DataTable DataTableGetir(string sql)
{
OleDbConnection baglan = this.baglan();
OleDbDataAdapter adapter = new OleDbDataAdapter(sql, baglan);
DataTable dt = new DataTable();
try
{
adapter.Fill(dt);
}
catch (OleDbException ex)
{
throw new Exception(ex.Message);
}
adapter.Dispose();
baglan.Close();
baglan.Dispose();
return dt;
}
Esasında bu iki fonksiyon işimizi görür. Bu iki fonksiyon ile insert, update, delete ve select işlemlerimizi yapabiliriz.
Esasında bu iki fonksiyon işimizi görür. Bu iki fonksiyon ile insert, update, delete ve select işlemlerimizi yapabiliriz.
Fakat yazılım yaparken her zaman “eğer aynı işi daha az
kodla yapabiliyorsan, daha az kodla yap” felsefesi işler.
Bura da fonksiyonlarımıza bir yenisini
daha ekleyip “DataTableGetir” fonksiyonuyla içini doldurduğumuz DataTable ın
sadece ilk satırını alacağız. Zaten çoğu select cümlesi sadece ilk satır için
yapılmıyor mu?
public DataRow DataRowGetir(string sql)
public DataRow DataRowGetir(string sql)
{
DataTable tablo = DataTableGetir(sql);
if (tablo.Rows.Count == 0) return null;
return tablo.Rows[0];
}
Bu fonksiyon ile DataTable ın sadece ilk satırını okuyoruz.
FONKSİYONUN KULLANILMASI
Şimdi sıra geldi hazırlamış olduğumuz fonksiyonu kullanmaya. Öncelikle Fonksiyonu kullanacağımız .cs sayfasının namespace lerine “using System.Data;” yı ekliyoruz ve fonksiyonumuzu aşağıdaki gibi çağırıyoruz.
Bu fonksiyon ile DataTable ın sadece ilk satırını okuyoruz.
FONKSİYONUN KULLANILMASI
Şimdi sıra geldi hazırlamış olduğumuz fonksiyonu kullanmaya. Öncelikle Fonksiyonu kullanacağımız .cs sayfasının namespace lerine “using System.Data;” yı ekliyoruz ve fonksiyonumuzu aşağıdaki gibi çağırıyoruz.
using System.Data; //namespace i ekliyoruz
public partial class _Default : System.Web.UI.Page
{
Baglantim bg = new Baglantim(); //Fonksiyonumuzu çağırıyoruz
protected void Page_Load(object sender, EventArgs e)
{
}
}
İnsert İşlemi
İnsert.aspx
>
<asp:TextBox ID="Kisi_Adi" runat="server"></asp:TextBox>
<asp:TextBox ID="Kisi_Tel" runat="server"></asp:TextBox>
<asp:TextBox ID="Kisi_Email" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
insert.aspx.cs
insert.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data; //mutlaka ekliyoruz
public partial class insert : System.Web.UI.Page
{
Baglantim bg = new Baglantim(); // Fonksiyonumuzu çağırıyoruz
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string adi = Kisi_Adi.Text.ToString();
string email = Kisi_Email.Text.ToString();
string tel = Kisi_Tel.Text.ToString();
bg.idu("insert
into Kisiler (KisiAdi,KisiTel,KisiEmail) Values ('"+adi+"', '"+tel+"', '"+email+"')"); // insert cümlemiz
}
}
görüldüğü gibi tek satırda insert olayını halletmiş oluyoruz.
görüldüğü gibi tek satırda insert olayını halletmiş oluyoruz.
Update
İşlemi
insert işleminin aynısı sadece insert cümlesi yerine update cümlesi yazıyoruz
insert işleminin aynısı sadece insert cümlesi yerine update cümlesi yazıyoruz
bg.idu("Update Kisiler SET KisiAdi='"+adi+"', KisiTel='"+tel+"',KisiEmail='"+email+"' where KisiID=1");
Burada siz where KisiID kısmını nasıl
isterseniz öyle düzenleyebilirsiniz. Ben 1 numaralı ID deki kişiyi update
ettim.
Delete İşlemi
bg.idu("Delete from Kisiler Where KisiID=1");
Select İşlemi
select.aspx
<div>
Delete İşlemi
bg.idu("Delete from Kisiler Where KisiID=1");
Select İşlemi
select.aspx
<div>
<asp:Repeater ID="getir" runat="server">
<ItemTemplate>
<%#Eval("KisiAdi") %> <br />
</ItemTemplate>
</asp:Repeater>
</div>
select.aspx.cs
select.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
public partial class Select : System.Web.UI.Page
{
Baglantim bg = new Baglantim(); // Fonksiyonu çağırıyoruz
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = bg.DataTableGetir("Select
* From Kisiler"); // select cümlesi
this.getir.DataSource = dt;
this.getir.DataBind();
}
}
DataTable ımızı tek satır kod ile doldura biliyoruz.
Peki sadece ilk satıra ihtiyacımız olsaydı
DataTable ımızı tek satır kod ile doldura biliyoruz.
Peki sadece ilk satıra ihtiyacımız olsaydı
Select.aspx
sayfasında </asp:Repeater> den sonra bir label ekleyelim ve ID sine ilk_satir
diyelim
<asp:Label ID="ilk_satir" runat="server" Text="Label"></asp:Label> bu şekilde
select.aspx.cs kısmına da aşağıda ki gibi ilk satırı yazdıralım
<asp:Label ID="ilk_satir" runat="server" Text="Label"></asp:Label> bu şekilde
select.aspx.cs kısmına da aşağıda ki gibi ilk satırı yazdıralım
DataRow dr = bg.DataRowGetir("Select * From Kisiler");
ilk_satir.Text = dr["KisiAdi"].ToString();
Umarım faydalanabileceğiniz bir anlatım olmuştur örnek
dosyayı Buradan indirebilirsiniz. Sorularınız olursa elimden geldiğince
yanıtlamaya çalışırım.