29 Ara 2010 Bunu mu aramıştınız: ASP.NET Kategori: ASP.NET Etiketler: C#ASP.NET 4.0ADO.NETASP.NETSQL Server 5 Yorum Merhaba arkadaşlar, bu makalemizde arama motorlarının en sevdiğim özelliklerinden biri olan arama yaparken hatalı girdiğimiz kelimeleri düzelterek bize öneriler sunmasıdır. Bizde bu makelemizde bu tarz bir uygulamayı ASP.NET ile yapacağız.Arama motorları hayatımızda pek çok şeyi kolaylaştıran ve bizi aradığımız bilgilere ulaştıran çok önemli bir güç. Bu gücün farkına varan arama motoru geliştiricileri son dönemde kullanıcılarına çok fazla yenilikler sunmaya başladılar. Arama önerileri, bunu mu aramıştınız, fotoğraf arama, dokuman arama vs. bunlardan sadece bir kaçı. Biz bu makalemiz de web uygulamamızda kullanacağımız bir arama motoru hazırlayıp kullanıcılara arama önerileri sunacağız. Yani kullanıcıların yapmış olduğu girişlere uygun sonuç yoksa en yakın sonucu getirip bunu mu aramıştınız diye soracağız.Örneğe geçmeden önce T-SQL’de bulunan 2 fonksiyonu inceleyeceğiz. Soundex ve Difference. SoundexSoundex, iki kelime arasındaki benzerligi ölçebilmek için bize kelime ile ilgili 4 karakterli bir kod döndüren bir fonksiyondur. Bu kod ile birbirine benzeyen kelimeleri eşleştirebiliriz. Bu eşleşme sonucuna biribirine benzeyen kayıtları elde edebiliriz. Aşağıdaki iki satırıda çalıştırdığımız da aynı sonucu verecek. (Sonuç: S500)SELECT SOUNDEX('Sem Göksu')SELECT SOUNDEX('Sen Göksu')DifferenceDifference, Soundex’e benzeyen bir algoritmaya sahip. İki kelime arasında benzerlik oranına göre geriye 0 ile 4 arasında sayısal bir değer döndürür. Bu sonuca göre yapılan aramada benzerlik oranı belli bir değer üzerinde olan kayıtları resultset içerisine alabiliriz.SELECT DIFFERENCE('ASYA GÖKSU', 'AYSA GÖKSU')Bu iki fonksiyon ile, bunu mu aramıştınız özelliğini arama motorumuza ek özellik olarak katabiliriz. Bunun için bir örnek bir proje hazırlayalım. Örneğimizde kullanabileceğimiz bir veritabanı ve tablo hazırlayalım. Benim veritabanım adı Bing, içerikler için kullanacağım tablomun adı da Contents olacak. Tablo içerisinde de 3 alanım olacak: ContentID, Title, Description. (Ben örnek basit olsun diye fazla alan kullanmadım. Siz kendi projelerinizde farklı alanlarda da kullanabilirsiniz)Tablo içerisindeki kayıtlar da aşağıdaki gibidir.Bir ASP.NET projesini oluşturalım. Arama sayfamızın HTML kodları aşağıda gibi olacak. <div> <asp:TextBox ID="txtKeyword" runat="server" Width="320px"></asp:TextBox> <asp:Button ID="btnSearch" runat="server" Text="Ara" OnClick="btnSearch_Click" /> <p><asp:Literal ID="ltlResultText" runat="server"></asp:Literal></p> <asp:Repeater ID="rptResults" runat="server"> <HeaderTemplate> <table> </HeaderTemplate> <ItemTemplate> <tr> <td> <asp:HyperLink ID="hypTitle" runat="server" NavigateUrl="#" Text='<%# Eval("Title") %>'></asp:HyperLink> </td> </tr> <tr> <td> <asp:Literal ID="ltlDescription" runat="server" Text='<%# Eval("Description") %>'></asp:Literal> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate></asp:Repeater></div>Arama sonuçlarını görüntülemek için butona tıkladığımızda yapacağımız işlemleri yapalım. Ben 2 ayrı metot yazdım. Search ve DidYouMean. Search metodu buton altından çağırılacak. Eğer search metodu arama ile ilgili kayıt bulursa kayıtları listeleyecek. Kayıt bulamazsa DidYouMean isimli metodu çağıracak ve aramaya uygun en yakın kayıt getirilip kullanıcıya arama önerisinde bulunulacak. Arama önerilerini yapmak için de DidYouMean metodu içerisindeki sorguda Diffrence fonksiyonunu kullanacağım. (Diffrence fonksiyonunu kullandığımız için Soundex'e gerek kalmadı. O yüzden bu makale de soundex'i kullanmayacağım,. Daha ileri seviye bir uygulama yaparken ikisini de kullanabiliriz. )protected void btnSearch_Click(object sender, EventArgs e){ Search(txtKeyword.Text.Trim());}[Search() Metodu] public void Search(string keyword){ SqlConnection cnn = new SqlConnection("Server=.; Database=Bing; Trusted_Connection=yes"); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "Select * From Contents Where Title Like '%' + @Keyword+ '%'"; cmd.Parameters.AddWithValue("@Keyword", keyword); cmd.Connection = cnn; SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if (dt != null && dt.Rows.Count > 0) { rptResults.DataSource = dt; rptResults.DataBind(); } else { DidYouMean(keyword); // Bunu mu aramıştınız metoduna çağrıda bulunuyoruz. rptResults.DataSource = null; rptResults.DataBind(); }}[DidYouMean Metodu]public void DidYouMean(string keyword){ SqlConnection cnn = new SqlConnection("Server=.; Database=Bing; Trusted_Connection=yes"); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "Select top 1 * From Contents Where DIFFERENCE(Title, @Keyword) >=3"; cmd.Parameters.AddWithValue("@Keyword", keyword); cmd.Connection = cnn; SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if (dt != null && dt.Rows.Count > 0) { ltlResultText.Text = string.Format("Bunu mu aramıştınız: <u style='color:red'>{0}</u>", dt.Rows[0]["Title"].ToString()); } else { ltlResultText.Text = "Arama kriterlerinize uygun sonuç bulunamadı."; }}Tablodaki kayıtlarımıza uygun bir arama yapalım. Örneğin, Alex yazalım ve sonuca bakalım.Hatalı bir arama yapalım. Örneğin, Alex Le Sonsuza.T-SQL’de Difference komutunu kullanarak kullanıcılara benzer sonuçlara göre arama önerileri sunmuş olduk. Makalemizin sonuna geldik, bir sonraki makalede görüşmek üzere. ASP.NET ile kalın JSem GÖKSUaskisem@hotmail.com www.semgoksu.com | www.yazilimgunlugu.com
04 Mar 2007 Enterprise Library 3.0 February 2007 CTP Yayınlandı... Kategori: Yazılım Etiketler: ADO.NETMicrosoft.NET Framework 0 Yorum Enterprise Library 3.0 February 2007 CTP yayınlandı...Indirmek için Tıklayınız
04 Mar 2007 ASP.NET İle Stored Procedure Kullanımı – 2 Kategori: ASP.NET Etiketler: ASP.NETSQL ServerADO.NET 2 Yorum Merhaba arkadaşlar, bu makalemizde ASP.NET İle SQL Server üzerinde Insert, Update ve Delete işlemleri yapan Stored Procedureleri oluşturup, oluşturduğumuz store procedurleri ASP.NET Projemizde kullanacağız…Bir önceki makalemizde Bize datayı listeleyen Stored Procedure olusturup bunu ASP.NET içinde kullanmıstık. Bu makalemizde ise Ekleme, Çıkarma ve Güncelleme Stored Proc. Ekleyecek ve bunu asp.net sayfalarında kullanacagız. Insert: Tablumuza Kayıt ekliyoruz. Not: Person.Contact Tablosuna kayıt eklemek için Allov null alanları seçili olmayan fieldları seçelim. SP'yi düzgün yazsak bile çalısmayacaktır. Create Proc InsertPerson @FirstName varchar(20), @LastName varchar (20) as Insert Into Person.Contact (FirstName,LastName) values (@FirstName, @LastName) Sp'mizi Test edelim.. InsertPerson 'sem','göksu' // Bakalım Eklemismi ? Simdi bu islemi ASP.NET tarafında da yapalım. Olusturmus oldugumuz projeye yeni bir sayfa ekleyelim ve sayfamız üzerine 2 textbox ve 1 button ekleyelim. Button'un Click eventine asagıdaki kodları yazalım; protected void Button1_Click(object sender, EventArgs e) { try { Cnn = new SqlConnection("Data Source=localhost; Initial Catalog=AdventureWorks; trusted_connection=yes"); Cmd = new SqlCommand(); Cmd.CommandType = CommandType.StoredProcedure; Cmd.CommandText = "InsertPerson"; Cmd.Parameters.AddWithValue("@FirstName", TextBox1.Text); Cmd.Parameters.AddWithValue("@LastName", TextBox2.Text); Cmd.Connection = Cnn; if (Cnn.State == ConnectionState.Closed) Cnn.Open(); int result = Cmd.ExecuteNonQuery(); Response.Write(result.ToString() + " Kayıt Eklendi..."); } catch (Exception ex) { Response.Write(ex.Message); } } Insert islemimizi tamamladık simdi Update Islemine geçebiliriz. Update: Varolan bir kaydı güncelliyoruz. Create Proc UpdatePerson @ExFirstname varchar(20), @NewFirstname varchar(20) as Update Person.Contact Set FirstName = @NewFirstname where FirstName=@ExFirstname Test edelim; UpdatePerson 'Crystal','Penguen' (22 row(s) affected) > 22 tane Firstname'i Crystal olan kayıt person ile degistirildi. Simdi Asp.net tarafını yazalım; Yeni Bir sayfa ekleyelim ve sayfamıza 2 textbox ve 1 button girelim. 1. textbox'a güncellenecek olan Firstname'i ve 2.textbox'ada yeni degeri girecegiz. Buton ile de islemi gerçeklestirecegiz. Button'un click eventine asagıdaki kodları yazalım; protected void Button1_Click(object sender, EventArgs e) { try { Cnn = new SqlConnection("Data Source=localhost; Initial Catalog=AdventureWorks; trusted_connection=yes"); Cmd = new SqlCommand(); Cmd.CommandType = CommandType.StoredProcedure; Cmd.CommandText = "UpdatePerson"; Cmd.Parameters.AddWithValue("@ExFirstname", TextBox1.Text); Cmd.Parameters.AddWithValue("@NewFirstname", TextBox2.Text); Cmd.Connection = Cnn; if (Cnn.State == ConnectionState.Closed) Cnn.Open(); int result = Cmd.ExecuteNonQuery(); Response.Write(result.ToString() + " Kayıt güncellendi..."); } catch (Exception ex) { Response.Write(ex.Message); } } Hemen test edelim; Sp'yi test ederken Firstname'i Crystal olan kayıtları penguen ile degistirmistim. Simdi yeniden eski degeri ile update etmis oldum. 22 adet kaydın güncellendigini görüyoruz. Delete: Tablomuzdan kayıt siliyoruz. Stored Proc. Olusturalım. Not: Eger Sizde benim kullandıgım gibi Person.Contact tablosunu kullanacaksanız tablo Üzerindeki Foreign keyleri kaldırın. Yoksa kayıtları silemeyeceksiniz. create proc DeletePerson @Firstname varchar(20) as Delete from Person.Contact where FirstName = @Firstname SP'yi test edelim. DeletePerson 'Gustavo' (2 row(s) affected) > Gustavo adın da 2 kaydı sildi.. Simdi son olarak da bunun asp.net tarafını yapalım. Yeni bir sayfa ekleyelim ve sayfamıza 1 textbox ve 1 button ekleyelim. Daha sonra butonun click eventine asagıdaki kodları yazalım; protected void Button1_Click(object sender, EventArgs e) { try { Cnn = new SqlConnection("Data Source=localhost; Initial Catalog=AdventureWorks; trusted_connection=yes"); Cmd = new SqlCommand(); Cmd.CommandType = CommandType.StoredProcedure; Cmd.CommandText = "DeletePerson"; Cmd.Parameters.AddWithValue("@Firstname", TextBox1.Text); Cmd.Connection = Cnn; if (Cnn.State == ConnectionState.Closed) Cnn.Open(); int result = Cmd.ExecuteNonQuery(); Response.Write(result.ToString() + " Kayıt silindi..."); } catch (Exception ex) { Response.Write(ex.Message); } } Testimizi yapalım; Firstname'i "Sem" olan 5 kayıt vardı ve biz bunu stored procedurumuzü çalıstırarak sildik.. Bu makalenin de sonuna geldik, Baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSUMCP | MCAD.NET | MCTS Örnek Kodlar için mail adresimi kullanabilirsiniz semgoksu@semgoksu.com Kaynaklar http://msdn.com
12 Oca 2007 Microsoft Data Access Application Block Kategori: ADO.NET Etiketler: ADO.NETMicrosoft 1 Yorum Merhaba arkadaşlar bu makalemizde Microsoftun geliştirmiş olduğu Microsoft Data Access Application Block üzerinde duracağız. Giris .Net Framework, veritabanı ile çalısmak için yazılım gelistiricelere ADO.NET'i sundu. ADO.NET bize veriyi görüntülemek ve veri üzerinde islemler yapmamızı saglar. Veritabnındaki bazı bilgilere erismek ve uygulama üzerinde bazı parametreleri kullanabilecegini göz önünde bulunduralım. Bu islemi 6-7 satır kod yazarak kolayca yapabiliriz. Fakat, 5-6 satır kodu tekrar tekrar yazmak zorunda kaldıgımızda bu islemi yapmak kolay olmayacaktır. Microsoft bunun için, Daha az kod ile ortak isleri yapmak için kullanılabilen Data Access Application Block'u gelistirdi. Data Access Application Block'u asagıdaki adresten indirebilirsiniz. http://msdn2.microsoft.com/en-us/library/ms954827.aspx Microsoft .net Data Access Application Block Nasıl Kullanılır ? Ilk olarak Data Access Application Block Version 2.0.(Daha eski/yeni versionda olabilir) indirip kuralım. Ilk olarak the Microsoft .net Data Access Application Block projesi için .dll dosyası olusturacagız. Projeyi build ettikten sonra kendi projemize basitçe ekleyebiliriz. Kendi projemize ekledikten sonra bin klasörü içindeki .dll dosyasınıda build edelim. Data Access Application Block olmadan Dataya Erismek Ilk olarak Application olmadan veriye nasıl erisildigine bakacagız. Asagıda veritabanına 2 parametre ekleyen basit bir örnek yapacagız. string connectionString = (string) ConfigurationSettings.AppSettings["ConnectionString"]; SqlConnection connection = new SqlConnection(connectionString); SqlCommand command = new SqlCommand("INSERT_MUSTERI",connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@Name",SqlDbType.NVarChar,50)); command.Parameters["@Name"].Value = txtName.Text; command.Parameters.Add(new SqlParameter("@Surname",SqlDbType.NVarChar,10)); command.Parameters["@Surname "].Value = txt Surname.Text; connection.Open(); command.ExecuteNonQuery(); connection.Close(); Görüldügü gibi veritabanına parametre eklemeye çalıstıgımızda 6-7 satır kod ile isimizi tamamladık. Fakat 10 yada daha fazla parametre eklemeye çalıstıgımızda gelistirme zamanı bir hayli uzayacaktı. Simdi aynı islemi Microsoft .net Data Access Application Block kullanarak yapalım. using Microsoft.ApplicationBlocks.Data; SqlHelper.ExecuteNonQuery(connection,"INSERT_MUSTERI",new SqlParameter("@Name",txtName.Text) ,new SqlParameter("@Surname",txt Surname.Text) ); Gördügünüz gibi 5-6 satır kod yazmak yerine isimizi tek satırda tamamladık. Bu islemi SqlHelper classı ile yaptıgımız gördük. Peki bu SqlHelper nereden çıktı? Projemizin namespacelerine Microsoft.ApplicationBlocks.Data eklersek SqlHelper Classına erisebiliriz. SqlHelper Classı veritabanına erismek için static metodlar içeren ve Microsoft tarafından gelistirilen bir classdır. Her hangi bir text editörü ile SqlHelper Classını açabilir ve inceleyebilirsiniz. SqlHelper Class SqlHelper'in içindeki static metodlar; ExecuteNonQuery ExecuteDataSet ExecuteReader ExecuteScalar ExecuteXMLReader Evet artık örnegimize geçebiliriz. Ilk olarak bir Windows Application açalım. Simdi SqlHelper Classını projemize ekleyelim. (DLL olarak da ekleyebiliriz). Simdi projemizin namespacelerine ApplicationBlocks.Datayı ekleyelim. using Microsoft.ApplicationBlocks.Data; Ekledikten sonra formumuzun üzerine 1 adet buton ve bir gridview ekleyelim. Evet Simdi ExecuteDataseti çalıstıracak kodları yazalım. string sqlstring = "Select * from Musteriler"; dataGridView1.DataSource = SqlHelpera.ExecuteDataset("Data Source=localhost; Initial Catalog=SemGoksuDB; trusted_connection=yes", CommandType.Text, sqlstring).Tables[0]; Simdi projeemizi çalıstıralım. Projemizi çalıstırdıktan sonra kayıtlarımızı listeledik. Gördügünüz gibi çok kolay bir sekilde 1-2 satır ile isimizi yaptık. Bu makalenin de sonuna geldik, baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSU MCP | MCAD.NET | MCTS Örnek Kodlar için mail adresimi kullanabilirsiniz semgoksu@semgoksu.com Kaynaklar http://msdn.microsoft.com