ASP.NET Web Sayfaları (Razor) Sitelerinde Veritabanıyla Çalışmaya Giriş
yazan: Tom FitzMacken
Bu makalede, ASP.NET Web Sayfaları (Razor) web sitesinde veritabanı oluşturmak için Microsoft WebMatrix araçlarının nasıl kullanılacağı ve verileri görüntülemenize, eklemenize, düzenlemenize ve silmenize olanak sağlayan sayfaların nasıl oluşturulacağı açıklanır.
Öğrenecekleriniz:
- Veritabanı oluşturma.
- Veritabanına bağlanma.
- Web sayfasında verileri görüntüleme.
- Veritabanı kayıtlarını ekleme, güncelleştirme ve silme.
Makalede sunulan özellikler şunlardır:
- Microsoft SQL Server Compact Edition veritabanıyla çalışma.
- SQL sorgularıyla çalışma.
- Sınıf
Database
.Öğreticide kullanılan yazılım sürümleri
- ASP.NET Web Sayfaları (Razor) 2
- WebMatrix 2
Bu öğretici, WebMatrix 3 ile de çalışır. ASP.NET Web Sayfaları 3 ve Visual Studio 2013 (veya Web için Visual Studio Express 2013) kullanabilirsiniz; ancak kullanıcı arabirimi farklı olacaktır.
Veritabanlarına Giriş
Tipik bir adres defteri düşünün. Adres defterindeki her giriş için (diğer bir ifadeyle her bir kişi için) ad, soyadı, adres, e-posta adresi ve telefon numarası gibi çeşitli bilgilere sahip olursunuz.
Verileri bu şekilde görselleştirmenin tipik bir yolu, satır ve sütun içeren bir tablodur. Veritabanı terimlerinde her satır genellikle kayıt olarak adlandırılır. Her sütun (bazen alan olarak da adlandırılır) her veri türü için bir değer içerir: ad, soyadı vb.
ID | FirstName | LastName | Adres | E-posta | Telefon |
---|---|---|---|---|---|
1 | Jim | Abrus | 210 100. St SE Orcas WA 98031 | jim@contoso.com | 555 0100 |
2 | Terry | Adams | 1234 Main St. Seattle WA 99011 | terry@cohowinery.com | 555 0101 |
Çoğu veritabanı tablosunda, tablonun müşteri numarası, hesap numarası vb. benzersiz tanımlayıcı içeren bir sütunu olmalıdır. Bu, tablonun birincil anahtarı olarak bilinir ve bunu tablodaki her satırı tanımlamak için kullanırsınız. Örnekte, Kimlik sütunu adres defterinin birincil anahtarıdır.
Veritabanlarıyla ilgili bu temel anlayışla, basit bir veritabanı oluşturmayı ve veri ekleme, değiştirme ve silme gibi işlemleri gerçekleştirmeyi öğrenmeye hazırsınız.
İpucu
İlişkisel Veritabanları
Metin dosyaları ve elektronik tablolar da dahil olmak üzere birçok yolla veri depolayabilirsiniz. Ancak çoğu iş kullanımları için veriler ilişkisel bir veritabanında depolanır.
Bu makale veritabanlarında çok derine inmiyor. Ancak, bunlar hakkında biraz bilgi edinmek yararlı olabilir. İlişkisel veritabanında bilgiler mantıksal olarak ayrı tablolara ayrılır. Örneğin, bir okulun veritabanı öğrenciler ve sınıf teklifleri için ayrı tablolar içerebilir. Veritabanı yazılımı (SQL Server gibi) tablolar arasında dinamik olarak ilişki kurmanızı sağlayan güçlü komutları destekler. Örneğin, ilişkisel veritabanını kullanarak öğrencilerle sınıflar arasında mantıksal bir ilişki kurarak bir zamanlama oluşturabilirsiniz. Verileri ayrı tablolarda depolamak, tablo yapısının karmaşıklığını azaltır ve tablolarda yedekli verileri tutma gereksinimini azaltır.
Veritabanı Oluşturma
Bu yordam, WebMatrix'te bulunan SQL Server Compact Veritabanı tasarım aracını kullanarak SmallBakery adlı bir veritabanının nasıl oluşturulacağını gösterir. Kod kullanarak veritabanı oluşturabilirsiniz ancak WebMatrix gibi bir tasarım aracı kullanarak veritabanı ve veritabanı tablolarını oluşturmak daha normaldir.
WebMatrix'i başlatın ve Hızlı Başlangıç sayfasında Şablondan Site'ye tıklayın.
Siteyi Boşalt'ı seçin ve Site Adı kutusuna "SmallBakery" yazın ve Tamam'a tıklayın. Site oluşturulur ve WebMatrix'te görüntülenir.
Sol bölmede Veritabanları çalışma alanına tıklayın.
Şeritte Yeni Veritabanı'na tıklayın. Sitenizle aynı ada sahip boş bir veritabanı oluşturulur.
Sol bölmede SmallBakery.sdf düğümünü genişletin ve tablolar'a tıklayın.
Şeritte Yeni Tablo'ya tıklayın. WebMatrix tablo tasarımcısını açar.
Ad sütununa tıklayın ve "Kimlik" yazın.
Veri Türü sütununda int'i seçin.
Birincil Anahtar Mı? ve Tanımlansın mı? seçeneklerini Evet olarak ayarlayın.
Adından da anlaşılacağı gibi Birincil Anahtar Mı , veritabanına bunun tablonun birincil anahtarı olacağını söyler. Kimlik veritabanına her yeni kayıt için otomatik olarak bir kimlik numarası oluşturmasını ve bir sonraki sıralı numarayı atamasını söyler (1'den başlayarak).
Sonraki satıra tıklayın. Düzenleyici yeni bir sütun tanımı başlatır.
Ad değeri olarak "Ad" yazın.
Veri Türü için "nvarchar" öğesini seçin ve uzunluğu 50 olarak ayarlayın. öğesinin
nvarchar
var bölümü veritabanına bu sütunun verilerinin, boyutu kayıttan kayda farklılık gösterebilecek bir dize olacağını söyler. ( n ön eki ulusal değeri temsil eder, bu da alanın herhangi bir alfabeyi veya yazma sistemini temsil eden karakter verilerini barındırabileceğini gösterir; yani alanın Unicode verilerini barındırdığını gösterir.)Null'lara İzin Ver seçeneğini Hayır olarak ayarlayın. Bu, Ad sütununun boş bırakılmamasını zorunlu kılacak.
Aynı işlemi kullanarak Açıklama adlı bir sütun oluşturun. Veri Türü'nü "nvarchar" ve uzunluk için 50 olarak, Null Değerlere İzin Ver'i false olarak ayarlayın.
Price adlı bir sütun oluşturun. Veri Türü'nü "money" ve Allow Nulls değerini false olarak ayarlayın.
Üstteki kutuda tabloyu "Ürün" olarak adlandırın.
İşiniz bittiğinde tanım şöyle görünür:
Tabloyu kaydetmek için Ctrl+S tuşlarına basın.
Veritabanına Veri Ekleme
Artık makalenin devamında üzerinde çalışacağınız bazı örnek verileri veritabanınıza ekleyebilirsiniz.
Sol bölmede SmallBakery.sdf düğümünü genişletin ve tablolar'a tıklayın.
Product tablosuna sağ tıklayın ve ardından Veri'ye tıklayın.
Düzenleme bölmesine aşağıdaki kayıtları girin:
Ad Açıklama Fiyat Ekmek Her gün taze pişirilir. 2.99 Çilekli Kek Bahçemizden organik çileklerle yapılır. 9.99 Apple Pie Annenin pastasına sadece ikinci. 12.99 Pecan Pastası Pecan'ları seviyorsan, bu senin için. 10.99 Limonlu Pasta Dünyadaki en iyi limonlarla yapılır. 11.99 Cupcakes Çocukların ve içindeki çocuk bunlara bayılacak. 7.99 Kimlik sütunu için herhangi bir şey girmenize gerek olmadığını unutmayın. Kimlik sütununu oluşturduğunuzda, IsIdentity özelliğini true olarak ayarlarsınız ve bu da sütunun otomatik olarak doldurulmasına neden olur.
Verileri girmeyi bitirdiğinizde tablo tasarımcısı şöyle görünür:
Veritabanı verilerini içeren sekmeyi kapatın.
Veritabanından Veri Görüntüleme
Veri içeren bir veritabanınız olduğunda, verileri bir ASP.NET web sayfasında görüntüleyebilirsiniz. Görüntülenecek tablo satırlarını seçmek için veritabanına geçirdiğiniz bir komut olan SQL deyimini kullanırsınız.
Sol bölmede Dosyalar çalışma alanına tıklayın.
Web sitesinin kökünde ListProducts.cshtml adlı yeni bir CSHTML sayfası oluşturun.
Var olan işaretlemeyi aşağıdakilerle değiştirin:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Small Bakery Products</title> <style> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Small Bakery Products</h1> <table> <thead> <tr> <th>Id</th> <th>Product</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach(var row in db.Query(selectQueryString)){ <tr> <td>@row.Id</td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </body> </html>
İlk kod bloğunda, daha önce oluşturduğunuz SmallBakery.sdf dosyasını (veritabanı) açarsınız. yöntemi,
Database.Open
.sdf dosyasının web sitenizin App_Data klasöründe olduğunu varsayar. ( .sdf uzantısını belirtmeniz gerekmediğini, aslında bunu yaparsanız yönteminOpen
çalışmayacağını fark edin.)Not
App_Data klasörü, ASP.NET'da veri dosyalarını depolamak için kullanılan özel bir klasördür. Daha fazla bilgi için bu makalenin devamında Yer alan Veritabanına Bağlanma bölümüne bakın.
Ardından aşağıdaki SQL
Select
deyimini kullanarak veritabanını sorgulama isteğinde bulunacaksınız:SELECT * FROM Product ORDER BY Name
deyiminde,
Product
sorguya yönelik tabloyu tanımlar. karakteri,*
sorgunun tablodaki tüm sütunları döndürmesi gerektiğini belirtir. (Sütunlardan yalnızca bazılarını görmek istiyorsanız sütunları virgülle ayırarak tek tek listeleyebilirsiniz.)Order By
yan tümcesi, verilerin ad sütununa göre nasıl sıralanması gerektiğini gösterir. Bu, verilerin her satır için Ad sütununun değerine göre alfabetik olarak sıralandığı anlamına gelir.Sayfanın gövdesinde, işaretleme verileri görüntülemek için kullanılacak bir HTML tablosu oluşturur. öğesinin
<tbody>
içinde, sorgu tarafından döndürülen her veri satırını ayrı ayrı almak için birforeach
döngü kullanırsınız. Her veri satırı için bir HTML tablosu satırı (<tr>
öğesi) oluşturursunuz. Ardından her sütun için HTML tablo hücreleri (<td>
öğeler) oluşturursunuz. Döngünün üzerinden her geçtiğinizde veritabanından bir sonraki kullanılabilir satır değişkenindedirrow
(bunu deyimindeforeach
ayarlarsınız). Satırdan tek bir sütun almak için, istediğiniz sütunun adını veyarow.Description
adını kullanabilirsinizrow.Name
.Sayfayı tarayıcıda çalıştırın. (Sayfayı çalıştırmadan önce Dosyalar çalışma alanında seçili olduğundan emin olun.) Sayfada aşağıdakine benzer bir liste görüntülenir:
İpucu
Yapılandırılmış Sorgu Dili (SQL)
SQL, çoğu ilişkisel veritabanında veritabanındaki verileri yönetmek için kullanılan bir dildir. Verileri almanıza ve güncelleştirmenize ve veritabanı tablolarını oluşturmanıza, değiştirmenize ve yönetmenize olanak sağlayan komutlar içerir. SQL, programlama dilinden (WebMatrix'te kullandığınız dil gibi) farklıdır çünkü SQL'de fikir, veritabanına ne istediğinizi söylemenizdir ve verilerin nasıl alındığını veya görevi nasıl yerine getirebileceğinizi bulmak veritabanının görevidir. Bazı SQL komutlarının ve bunların ne yaptığının örnekleri aşağıda verilmiştir:
SELECT Id, Name, Price FROM Product WHERE Price > 10.00 ORDER BY Name
Bu, Price değeri 10'dan fazlaysa Ürün tablosundaki kayıtlardan Kimlik, Ad ve Fiyat sütunlarını getirir ve Sonuçları Ad sütununun değerlerine göre alfabetik sırada döndürür. Bu komut, ölçütlere uyan kayıtları içeren bir sonuç kümesi veya eşleşen kayıt yoksa boş bir küme döndürür.
INSERT INTO Product (Name, Description, Price) VALUES ("Croissant", "A flaky delight", 1.99)
Bu işlem Product tablosuna yeni bir kayıt ekler ve Name sütununu "Croissant" olarak, Description sütununu "A flaky delight" ve price değerini 1,99 olarak ayarlar.
DELETE FROM Product WHERE ExpirationDate < "01/01/2008"
Bu komut , Product tablosundaki son kullanma tarihi sütunu 1 Ocak 2008'den önce olan kayıtları siler. (Bu, Product tablosunun böyle bir sütunu olduğunu varsayar.) Tarih buraya AA/GG/YYYY biçiminde girilir, ancak yerel ayarınız için kullanılan biçimde girilmelidir.
Insert Into
ve Delete
komutları sonuç kümelerini döndürmez. Bunun yerine, komutundan kaç kaydın etkilendiğini belirten bir sayı döndürürler.
Bu işlemlerden bazıları için (kayıtları ekleme ve silme gibi), işlemi isteyen işlemin veritabanında uygun izinlere sahip olması gerekir. Bu nedenle üretim veritabanları için veritabanına bağlanırken genellikle bir kullanıcı adı ve parola sağlamanız gerekir.
Onlarca SQL komutu vardır, ancak bunların tümü aşağıdakine benzer bir desen izler. SQL komutlarını kullanarak veritabanı tabloları oluşturabilir, tablodaki kayıt sayısını sayabilir, fiyatları hesaplayabilir ve daha birçok işlem gerçekleştirebilirsiniz.
Veritabanına Veri Ekleme
Bu bölümde, kullanıcıların Product veritabanı tablosuna yeni bir ürün eklemesine olanak tanıyan bir sayfanın nasıl oluşturulacağı gösterilmektedir. Yeni bir ürün kaydı eklendikten sonra sayfa, önceki bölümde oluşturduğunuz ListProducts.cshtml sayfasını kullanarak güncelleştirilmiş tabloyu görüntüler.
Sayfa, kullanıcının girdiği verilerin veritabanı için geçerli olduğundan emin olmak için doğrulama içerir. Örneğin, sayfadaki kod, tüm gerekli sütunlar için bir değer girildiğinden emin olur.
Web sitesinde InsertProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.
Var olan işaretlemeyi aşağıdakilerle değiştirin:
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var db = Database.Open("SmallBakery"); var Name = Request.Form["Name"]; var Description = Request.Form["Description"]; var Price = Request.Form["Price"]; if (IsPost && Validation.IsValid()) { // Define the insert query. The values to assign to the // columns in the Product table are defined as parameters // with the VALUES keyword. if(ModelState.IsValid) { var insertQuery = "INSERT INTO Product (Name, Description, Price) " + "VALUES (@0, @1, @2)"; db.Execute(insertQuery, Name, Description, Price); // Display the page that lists products. Response.Redirect("~/ListProducts"); } } } <!DOCTYPE html> <html> <head> <title>Add Products</title> <style type="text/css"> label {float:left; width: 8em; text-align: right; margin-right: 0.5em;} fieldset {padding: 1em; border: 1px solid; width: 50em;} legend {padding: 2px 4px; border: 1px solid; font-weight:bold;} .validation-summary-errors {font-weight:bold; color:red; font-size: 11pt;} </style> </head> <body> <h1>Add New Product</h1> @Html.ValidationSummary("Errors with your submission:") <form method="post" action=""> <fieldset> <legend>Add Product</legend> <div> <label>Name:</label> <input name="Name" type="text" size="50" value="@Name" /> </div> <div> <label>Description:</label> <input name="Description" type="text" size="50" value="@Description" /> </div> <div> <label>Price:</label> <input name="Price" type="text" size="50" value="@Price" /> </div> <div> <label> </label> <input type="submit" value="Insert" class="submit" /> </div> </fieldset> </form> </body> </html>
Sayfanın gövdesi, kullanıcıların ad, açıklama ve fiyat girmelerine olanak sağlayan üç metin kutusu içeren bir HTML formu içerir. Kullanıcılar Ekle düğmesine tıkladığında, sayfanın üst kısmındaki kod SmallBakery.sdf veritabanına bir bağlantı açar. Ardından nesnesini kullanarak
Request
kullanıcının gönderdiği değerleri alır ve bu değerleri yerel değişkenlere atarsınız.Kullanıcının gerekli her sütun için bir değer girdiğinizi doğrulamak için, doğrulamak istediğiniz her
<input>
öğeyi kaydedersiniz:Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required.");
Yardımcı,
Validation
kaydettiğiniz alanların her birinde bir değer olup olmadığını denetler. Kullanıcıdan edindiğiniz bilgileri işlemeden önce genellikle yaptığınız öğesini denetleyerekValidation.IsValid()
tüm alanların doğrulamadan geçip geçmediğini test edebilirsiniz:if (IsPost && Validation.IsValid()) { // Process information here }
(işleç
&&
, AND — bu test , bir form gönderimiyse ve tüm alanlar doğrulamadan geçmişse şeklindedir.)Tüm sütunlar doğrulandıysa (hiçbiri boş değilse), devam edip verileri eklemek için bir SQL deyimi oluşturup daha sonra gösterildiği gibi yürütebilirsiniz:
var insertQuery = "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";
Eklenecek değerler için parametre yer tutucularını (
@0
,@1
,@2
) eklersiniz.Not
Bir güvenlik önlemi olarak, yukarıdaki örnekte gördüğünüz gibi parametreleri kullanarak değerleri her zaman bir SQL deyimine geçirin. Bu size kullanıcının verilerini doğrulama şansı verir ve veritabanınıza kötü amaçlı komut gönderme girişimlerine (bazen SQL ekleme saldırıları olarak da adlandırılır) karşı korumaya yardımcı olur.
Sorguyu yürütmek için, yer tutucuların yerine geçecek değerleri içeren değişkenleri ileterek bu deyimi kullanırsınız:
db.Execute(insertQuery, Name, Description, Price);
Insert Into
deyimi yürütüldükten sonra, kullanıcıyı şu satırı kullanarak ürünleri listeleyen sayfaya gönderirsiniz:Response.Redirect("~/ListProducts");
Doğrulama başarılı olmazsa ekleme işlemini atlarsınız. Bunun yerine, sayfada birikmiş hata iletilerini (varsa) görüntüleyebilen bir yardımcınız vardır:
@Html.ValidationSummary("Errors with your submission:")
İşaretlemdeki stil bloğunun adlı
.validation-summary-errors
bir CSS sınıf tanımı içerdiğine dikkat edin. Bu, doğrulama hataları içeren öğe için<div>
varsayılan olarak kullanılan CSS sınıfının adıdır. Bu durumda, CSS sınıfı doğrulama özeti hatalarının kırmızı ve kalın olarak görüntüleneceğini belirtir, ancak sınıfını istediğiniz biçimlendirmeyi görüntüleyecek şekilde tanımlayabilirsiniz.validation-summary-errors
.
Sayfa Ekle'yi test etme
Sayfayı tarayıcıda görüntüleyin. Sayfada, aşağıdaki çizimde gösterilene benzer bir form görüntülenir.
Tüm sütunların değerlerini girin, ancak Price sütununu boş bıraktığınıza emin olun.
Ekle'ye tıklayın. Sayfa, aşağıdaki çizimde gösterildiği gibi bir hata iletisi görüntüler. (Yeni kayıt oluşturulmaz.)
Formu tamamen doldurun ve Ekle'ye tıklayın. Bu kez ListProducts.cshtml sayfası görüntülenir ve yeni kayıt gösterilir.
Veritabanındaki Verileri Güncelleştirme
Tabloya veri girildikten sonra verileri güncelleştirmeniz gerekebilir. Bu yordamda, daha önce veri eklemek için oluşturduğunuza benzer iki sayfanın nasıl oluşturulacağı gösterilir. İlk sayfada ürünler görüntülenir ve kullanıcıların değiştirmek için bir ürün seçmesine olanak tanır. İkinci sayfa, kullanıcıların düzenlemeleri yapmasına ve kaydetmesine olanak tanır.
Not
Önemli Üretim web sitesinde genellikle verilerde değişiklik yapmasına izin verilen kişileri kısıtlarsınız. Üyeliği ayarlama ve kullanıcıları sitede görev gerçekleştirme yetkisi verme yolları hakkında bilgi için bkz. ASP.NET Web Sayfaları Sitesine Güvenlik ve Üyelik Ekleme.
Web sitesinde EditProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.
Dosyadaki mevcut işaretlemeyi aşağıdakilerle değiştirin:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Edit Products</title> <style type="text/css"> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Edit Small Bakery Products</h1> <table> <thead> <tr> <th> </th> <th>Name</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach (var row in db.Query(selectQueryString)) { <tr> <td><a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </body> </html>
Bu sayfa ile daha önceki ListProducts.cshtml sayfası arasındaki tek fark, bu sayfadaki HTML tablosunun Düzenle bağlantısı görüntüleyen fazladan bir sütun içermesidir. Bu bağlantıya tıkladığınızda, sizi seçili kaydı düzenleyebileceğiniz UpdateProducts.cshtml sayfasına (bundan sonra oluşturacaksınız) götürür.
Düzenle bağlantısını oluşturan koda bakın:
<a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
Bu, özniteliği dinamik olarak ayarlanan bir HTML
<a>
öğesihref
oluşturur. özniteliği,href
kullanıcı bağlantıya tıkladığında görüntülenecek sayfayı belirtir. Ayrıca geçerli satırınId
değerini bağlantıya geçirir. Sayfa çalıştırıldığında, sayfa kaynağı aşağıdakine benzer bağlantılar içerebilir:<a href="UpdateProducts/1">Edit</a></td> <a href="UpdateProducts/2">Edit</a></td> <a href="UpdateProducts/3">Edit</a></td>
özniteliğinin
href
olarak ayarlandığınaUpdateProducts/n
dikkat edin; burada n bir ürün numarasıdır. Kullanıcı bu bağlantılardan birine tıkladığında, sonuçta elde edilen URL şöyle görünür:http://localhost:18816/UpdateProducts/6
Başka bir deyişle, düzenlenecek ürün numarası URL'ye geçirilir.
Sayfayı tarayıcıda görüntüleyin. Sayfa verileri şöyle bir biçimde görüntüler:
Ardından, kullanıcıların verileri gerçekten güncelleştirmesine olanak tanıyan bir sayfa oluşturacaksınız. Güncelleştirme sayfası, kullanıcının girdiği verileri doğrulamak için doğrulama içerir. Örneğin, sayfadaki kod, tüm gerekli sütunlar için bir değer girildiğinden emin olur.
Web sitesinde UpdateProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.
Dosyada var olan işaretlemeyi aşağıdakilerle değiştirin.
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var Name = ""; var Description = ""; var Price = Decimal.Zero; var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/EditProducts"); } var db = Database.Open("SmallBakery"); if (IsPost && Validation.IsValid()) { var updateQueryString = "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ; Name = Request["Name"]; Description = Request["Description"]; Price = Request["Price"].AsDecimal(); db.Execute(updateQueryString, Name, Description, Price, ProductId); Response.Redirect(@Href("~/EditProducts")); } else { var selectQueryString = "SELECT * FROM Product WHERE Id=@0"; var row = db.QuerySingle(selectQueryString, ProductId); Name = row.Name; Description = row.Description; Price = row.Price; } } <!DOCTYPE html> <html> <head> <title>Add Products</title> <style type="text/css"> label { float: left; width: 8em; text-align: right; margin-right: 0.5em;} fieldset { padding: 1em; border: 1px solid; width: 35em;} legend { padding: 2px 4px; border: 1px solid; font-weight: bold;} .validation-summary-errors {font-weight:bold; color:red; font-size:11pt;} </style> </head> <body> <h1>Update Product</h1> @Html.ValidationSummary("Errors with your submission:") <form method="post" action=""> <fieldset> <legend>Update Product</legend> <div> <label>Name:</label> <input name="Name" type="text" size="50" value="@Name" /> </div> <div> <label>Description:</label> <input name="Description" type="text" size="50" value="@Description" /> </div> <div> <label>Price:</label> <input name="Price" type="text" size="50" value="@Price" /> </div> <div> <label> </label> <input type="submit" value="Update" class="submit" /> </div> </fieldset> </form> </body> </html>
Sayfanın gövdesi, bir ürünün görüntülendiği ve kullanıcıların düzenleyebileceği bir HTML formu içerir. Ürünün görüntülenmesini sağlamak için şu SQL deyimini kullanırsınız:
SELECT * FROM Product WHERE Id=@0
Bu işlem, kimliği parametresinde geçirilen
@0
değerle eşleşen ürünü seçer. ( Kimlik birincil anahtar olduğundan ve bu nedenle benzersiz olması gerektiğinden, bu şekilde yalnızca bir ürün kaydı seçilebilir.) BuSelect
deyime geçirilecek kimlik değerini almak için, aşağıdaki söz dizimini kullanarak URL'nin bir parçası olarak sayfaya geçirilen değeri okuyabilirsiniz:var ProductId = UrlData[0];
Ürün kaydını gerçekten getirmek için yöntemini kullanırsınız
QuerySingle
ve bu yöntem yalnızca bir kayıt döndürür:var row = db.QuerySingle(selectQueryString, ProductId);
Tek satır değişkenine
row
döndürülür. Her sütundan veri alabilir ve bunu aşağıdaki gibi yerel değişkenlere atayabilirsiniz:var Name = row.Name; var Description = row.Description; var Price = row.Price;
Formun işaretlemesinde, bu değerler aşağıdaki gibi ekli kod kullanılarak tek tek metin kutularında otomatik olarak görüntülenir:
<input name="Name" type="text" size="50" value="@Name" />
Kodun bu bölümü güncelleştirilecek ürün kaydını görüntüler. Kayıt görüntülendikten sonra kullanıcı sütunları tek tek düzenleyebilir.
Kullanıcı Güncelleştir düğmesine tıklayarak formu gönderdiğinde, bloktaki
if(IsPost)
kod çalışır. Bu, nesnedenRequest
kullanıcının değerlerini alır, değerleri değişkenlerde depolar ve her sütunun doldurulduğunu doğrular. Doğrulama başarılı olursa kod aşağıdaki SQL Update deyimini oluşturur:UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3
SQL
Update
deyiminde, güncelleştirilecek her sütunu ve ayarlanacağı değeri belirtirsiniz. Bu kodda değerler , ,@1
,@2
vb. parametre yer tutucuları@0
kullanılarak belirtilir. (Daha önce belirtildiği gibi, güvenlik için her zaman parametreleri kullanarak değerleri bir SQL deyimine geçirmeniz gerekir.)yöntemini çağırdığınızda
db.Execute
, değerleri içeren değişkenleri SQL deyimindeki parametrelere karşılık gelen sırayla geçirirsiniz:db.Execute(updateQueryString, Name, Description, Price, ProductId);
Update
deyimi yürütüldükten sonra kullanıcıyı düzenleme sayfasına geri yönlendirmek için aşağıdaki yöntemi çağırırsınız:Response.Redirect(@Href("~/EditProducts"));
Bunun etkisi, kullanıcının veritabanındaki verilerin güncelleştirilmiş bir listesini görmesi ve başka bir ürünü düzenleyebiliyor olmasıdır.
Sayfayı kaydedin.
EditProducts.cshtml sayfasını (güncelleştirme sayfası değil) çalıştırın ve düzenle'ye tıklayarak düzenlenecek bir ürün seçin. Seçtiğiniz kaydı gösteren UpdateProducts.cshtml sayfası görüntülenir.
Bir değişiklik yapın ve Güncelleştir'e tıklayın. Ürün listesi, güncelleştirilmiş verilerinizle birlikte yeniden gösterilir.
Veritabanındaki Verileri Silme
Bu bölümde, kullanıcıların Ürün veritabanı tablosundan bir ürünü silmesine nasıl izin vereceğinizi gösterir. Örnek iki sayfadan oluşur. İlk sayfada, kullanıcılar silmek için bir kayıt seçer. Ardından silinecek kayıt, kaydı silmek istediklerini onaylamalarına olanak tanıyan ikinci bir sayfada görüntülenir.
Not
Önemli Üretim web sitesinde genellikle verilerde değişiklik yapmasına izin verilen kişileri kısıtlarsınız. Üyeliği ayarlama ve kullanıcıyı sitedeki görevleri gerçekleştirmesi için yetkilendirme yolları hakkında bilgi için bkz. ASP.NET Web Sayfaları Sitesine Güvenlik ve Üyelik Ekleme.
Web sitesinde ListProductsForDelete.cshtml adlı yeni bir CSHTML dosyası oluşturun.
Var olan işaretlemeyi aşağıdakilerle değiştirin:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Delete a Product</title> <style> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Delete a Product</h1> <form method="post" action="" name="form"> <table border="1"> <thead> <tr> <th> </th> <th>Name</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach (var row in db.Query(selectQueryString)) { <tr> <td><a href="@Href("~/DeleteProduct", row.Id)">Delete</a></td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </form> </body> </html>
Bu sayfa, daha önceki EditProducts.cshtml sayfasına benzer. Ancak, her ürün için bir Düzenle bağlantısı görüntülemek yerine bir Sil bağlantısı görüntüler. Sil bağlantısı, işaretlemede aşağıdaki eklenmiş kod kullanılarak oluşturulur:
<a href="@Href("~/DeleteProduct", row.Id)">Delete</a>
Bu, kullanıcılar bağlantıya tıkladığında şuna benzer bir URL oluşturur:
http://<server>/DeleteProduct/4
URL , DeleteProduct.cshtml adlı bir sayfayı (bundan sonra oluşturacaksınız) çağırır ve silinecek ürünün kimliğini geçirir (burada, 4).
Dosyayı kaydedin, ancak açık bırakın.
DeleteProduct.cshtml adlı başka bir CHTML dosyası oluşturun. Mevcut içeriği aşağıdakilerle değiştirin:
@{ var db = Database.Open("SmallBakery"); var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/ListProductsForDelete"); } var prod = db.QuerySingle("SELECT * FROM PRODUCT WHERE ID = @0", ProductId); if( IsPost && !ProductId.IsEmpty()) { var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; db.Execute(deleteQueryString, ProductId); Response.Redirect("~/ListProductsForDelete"); } } <!DOCTYPE html> <html> <head> <title>Delete Product</title> </head> <body> <h1>Delete Product - Confirmation</h1> <form method="post" action="" name="form"> <p>Are you sure you want to delete the following product?</p> <p>Name: @prod.Name <br /> Description: @prod.Description <br /> Price: @prod.Price</p> <p><input type="submit" value="Delete" /></p> </form> </body> </html>
Bu sayfa ListProductsForDelete.cshtml tarafından çağrılır ve kullanıcıların bir ürünü silmek istediklerini onaylamalarını sağlar. Silinecek ürünü listelemek için aşağıdaki kodu kullanarak URL'den silinecek ürünün kimliğini alırsınız:
var ProductId = UrlData[0];
Sayfa daha sonra kullanıcıdan kaydı gerçekten silmek için bir düğmeye tıklamasını ister. Bu önemli bir güvenlik önlemidir: Web sitenizde verileri güncelleştirme veya silme gibi hassas işlemler gerçekleştirdiğinizde, bu işlemler her zaman GET işlemi değil POST işlemi kullanılarak yapılmalıdır. Siteniz get işlemi kullanılarak bir silme işlemi gerçekleştirilecek şekilde ayarlandıysa, herkes gibi
http://<server>/DeleteProduct/4
bir URL geçirebilir ve veritabanınızdan istediği her şeyi silebilir. Silme işleminin yalnızca POST kullanılarak gerçekleştirilebilmesi için onay ekleyip sayfayı kodlayarak sitenize bir güvenlik ölçüsü eklersiniz.Asıl silme işlemi aşağıdaki kod kullanılarak gerçekleştirilir. Bu işlem ilk olarak bunun bir post işlemi olduğunu ve kimliğin boş olmadığını onaylar:
if( IsPost && !ProductId.IsEmpty()) { var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; db.Execute(deleteQueryString, ProductId); Response.Redirect("~/ListProductsForDelete"); }
Kod, belirtilen kaydı silen ve kullanıcıyı listeleme sayfasına geri yönlendiren bir SQL deyimi çalıştırır.
ListProductsForDelete.cshtml dosyasını tarayıcıda çalıştırın.
Ürünlerden birinin Sil bağlantısına tıklayın. Bu kaydı silmek istediğinizi onaylamak için DeleteProduct.cshtml sayfası görüntülenir.
Sil düğmesine tıklayın. Ürün kaydı silinir ve sayfa güncelleştirilmiş bir ürün listesiyle yenilenir.
İpucu
Veritabanına Bağlanma
Veritabanına iki şekilde bağlanabilirsiniz. İlki yöntemini kullanmak Database.Open
ve veritabanı dosyasının adını belirtmektir ( .sdf uzantısından az):
var db = Database.Open("SmallBakery");
yöntemi, Open
öğesinin olduğunu varsayar.sdf dosyası web sitesinin App_Data klasöründedir. Bu klasör, verileri tutmak için özel olarak tasarlanmıştır. Örneğin, web sitesinin verileri okumasına ve yazmasına izin vermek için uygun izinlere sahiptir ve bir güvenlik önlemi olarak WebMatrix bu klasördeki dosyalara erişime izin vermez.
İkinci yol bir bağlantı dizesi kullanmaktır. Bağlantı dizesi, veritabanına bağlanma hakkında bilgi içerir. Bu bir dosya yolu içerebilir veya yerel veya uzak bir sunucudaki SQL Server veritabanının adını ve bu sunucuya bağlanmak için bir kullanıcı adı ve parolayı içerebilir. (Verileri barındırma sağlayıcısının sitesinde olduğu gibi merkezi olarak yönetilen bir SQL Server sürümünde tutarsanız, veritabanı bağlantı bilgilerini belirtmek için her zaman bir bağlantı dizesi kullanırsınız.)
WebMatrix'te bağlantı dizeleri genellikle Web.configadlı bir XML dosyasında depolanır. Adından da anlaşılacağı gibi, sitenizin gerektirebileceği bağlantı dizeleri dahil olmak üzere sitenin yapılandırma bilgilerini depolamak için web sitenizin kökündeki bir Web.config dosyası kullanabilirsiniz. birWeb.config dosyasındaki bağlantı dizesi örneği aşağıdaki gibi görünebilir. Not $CREDENTIAL_PLACEHOLDER$
, parola anahtarı/değer çifti için bir yer tutucudur:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add
name="SQLServerConnectionString"
connectionString= "server=myServer;database=myDatabase;uid=username;$CREDENTIAL_PLACEHOLDER$"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Örnekte, bağlantı dizesi bir sunucuda bir yerde çalışan bir SQL Server örneğindeki bir veritabanına işaret eder (yerel bir .sdf dosyasının aksine). ve için uygun adları değiştirmeniz ve ve myDatabase
için myServer
username
password
SQL Server oturum açma değerlerini belirtmeniz gerekir. (Kullanıcı adı ve parola değerleri, Windows kimlik bilgilerinizle veya barındırma sağlayıcınızın sunucularında oturum açmak için size verdiği değerlerle aynı olmayabilir. İhtiyacınız olan tam değerleri yöneticiye danışın.)
Database.Open
yöntemi esnektir, çünkü bir veritabanı .sdf dosyasının adını veya Web.config dosyasında depolanan bir bağlantı dizesinin adını geçirmenize olanak tanır. Aşağıdaki örnekte, önceki örnekte gösterilen bağlantı dizesini kullanarak veritabanına nasıl bağlanıldığı gösterilmektedir:
@{
var db = Database.Open("SQLServerConnectionString");
}
Belirtildiği gibi, Database.Open
yöntemi bir veritabanı adı veya bağlantı dizesi geçirmenize olanak tanır ve hangisini kullanacağınızı bulur. Bu, web sitenizi dağıtırken (yayımladığınızda) çok yararlıdır. Sitenizi geliştirirken ve test ederken App_Data klasöründe bir .sdf dosyası kullanabilirsiniz. Daha sonra sitenizi bir üretim sunucusuna taşıdığınızda, Web.config dosyasında .sdf dosyanızla aynı ada sahip ancak barındırma sağlayıcısının veritabanına işaret eden bir bağlantı dizesi kullanabilirsiniz. Bunların hepsi kodunuzu değiştirmek zorunda kalmadan gerçekleşir.
Son olarak, doğrudan bir bağlantı dizesiyle çalışmak istiyorsanız yöntemini çağırabilir Database.OpenConnectionString
ve yalnızcaWeb.config dosyasındaki adı yerine gerçek bağlantı dizesini geçirebilirsiniz. Bu, herhangi bir nedenle sayfa çalışana kadar bağlantı dizesine (veya içindeki .sdf dosya adı gibi değerlere) erişiminiz olmadığı durumlarda yararlı olabilir. Ancak, çoğu senaryo için bu makalede açıklandığı gibi kullanabilirsiniz Database.Open
.
Ek Kaynaklar
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin