SQL Kodlarında Boğulmamanız İçin Hayat Kurtaran Bir Class


24. Mart 2012 05:15 by Serkan in Yazılım  //  Tags:   //   Yorumlar (0)
Bana ulaşan birkaç sorun ve sorulardan sonra, kısa bir araştırmamla internette, yazının konusunu oluşturan "sql ve datareaderla uğraşmadan, basit yolla verilere erişme ve işleme" konusuyla ilgili, işe yarayacak kodlara pek fazla rastlayamadım. Bu nedenle projemdeki TSQL verileri için yazdığım bu classı, projenize ekleyerek veri sorgulama, ekleme, güncelleme ve silme işlemlerini daha basit ve pratik yoldan yapabilmeniz için sizlerle paylaşıyorum. Bana müthiş zaman kazandırdığı gibi özellikle insert, update gibi karmaşık sql komutları kullanacaksanız bu class size temiz ve ayıklanabilir bir kod yazma imkanı sunacak.
 
Bu sınıfı nasıl kullanacağınıza gelince(sınıf için henüz summary yazmadığım için örneklerle anlatmak zorundayım) birkaç basit ve sade örneklerle size aktarıyorum:

-------------- TEK SATIR/TEK SÜTUN(return String) --------------
<%
Response.Write(DB.GetDataRow("tblUsers ", "WHERE xx_id=1", "xx_id", "xx_id"))
%>

-------------- TEK SATIRLIK VERİ(return Object) --------------
<%
'Aynı şekilde gelen veriyi dataadapter a Fill etmek için PublicDataReader yerine PublicDataAdapter fonksiyonunu kullanabilirsiniz. Metadata hatalarıyla karşılaşmamanız için .Dispose komutunu nesneyle işiniz bittikten sonra mutlaka kullanmanızı öneriyorum.
Dim objTest As Object = DB.PublicDataReader("SELECT xx_id,xx_name FROM tblUsers WHERE xx_id=1")
Response.Write(objTest("xx_name"))
objTest.Dispose()
%>


-------------- BİRDEN ÇOK VERİ/DÖNGÜLER(return Object) --------------
<%
Dim objTest As Object = DB.PublicDataReader("SELECT xx_id,xx_name FROM tblUsers WHERE xx_id=1", True)
Do While objTest.Read()
    Response.Write(objTest("xx_id") & objTest("xx_name"))
Loop
objTest.Dispose()
%>


-------------- VERİ EKLEME/GÜNCELLEME(return Integer) --------------
<%
'Save property değeri, güncellenen kayıt sayısını döndürür. Property olarak "Filter" kullanılırsa ilgili kayıt(lar) güncellenir veya Filter property değeri gönderilmezse bu yeni kayıt olarak algılanır.
Dim objSaveData As New DB
objSaveData.Table = "tblMemberLocations"
If IsNumeric(Request.QueryString("_id"))=True Then
     objSaveData.Filter = "WHERE xx_id=" & Request.QueryString("_id") & ""
End If
objSaveData.DataItem("xx_firstname") = "Test1"
objSaveData.DataItem("xx_lastname") = "Test2"
objSaveData.DataItem("xx_ip") = Request.Servervariables("Remote_Addr")
objSaveData.Save()
%>

Son olarak Page_Load veya başka bir event içerisinde kullanacağınız bu kodlardan sonra, sayfanın Page_Unload event bloğu içerisine
<%
DB.ConnActive.Close()
DB.ConnActive.Dispose()
%>
Kodlarını ekleyerek aktif bağlantıyı kapatmayı unutmayın.


<%
Public Class DB
		Public Shared ConnActive As New SqlConnection(Web.Configuration.WebConfigurationManager.ConnectionStrings("connStr").ConnectionString)
		Public DataRowNames, DataRowValues, Filter, Table As String

		Public Shared Function PublicDataReader(ByVal CurrentSqlString As String, Optional ByVal isLoop As Boolean = False, Optional ByVal OptionalString As String = "") As Object
			If OptionalString <> "" Then
				CurrentSqlString = OptionalString
			Else
				CurrentSqlString = CurrentSqlString
			End If
			Dim Reader As New Object
			Try
				If Not ConnActive.State = Data.ConnectionState.Open Then
					ConnActive.ConnectionString = Web.Configuration.WebConfigurationManager.ConnectionStrings("connStr").ConnectionString
					ConnActive.Open()
				End If
				Dim SqlCommand As New SqlCommand(CurrentSqlString, ConnActive)
				If Left(CurrentSqlString.ToLower, 6) = "update" Or Left(CurrentSqlString.ToLower, 6) = "insert" Or Left(CurrentSqlString.ToLower, 6) = "delete" Then
					Reader = SqlCommand.ExecuteNonQuery()
				Else
					Reader = SqlCommand.ExecuteReader(CommandBehavior.Default)
					If Not isLoop = True And Reader.HasRows = True Then
						Reader.Read()
					End If
				End If
				SqlCommand.Dispose()
				Return Reader
			Catch ex As Exception
				HttpContext.Current.Response.Write("<error>")
				HttpContext.Current.Response.Write("<message>" & ex.Message & "</message>")
				HttpContext.Current.Response.Write("<source>" & ex.Source & "</source>")
				HttpContext.Current.Response.Write("<error>")
				Return ""
			End Try
		End Function

		Public Shared Function PublicDataAdapter(ByVal TableName As String, ByVal CurrentSqlString As String, Optional ByVal OptionalString As String = "") As Object
			If OptionalString <> "" Then
				CurrentSqlString = OptionalString
			Else
				CurrentSqlString = CurrentSqlString
			End If
			Try
				Dim ReflectAdapterData As New SqlDataAdapter(CurrentSqlString, ConnActive)
				Dim oDataSet As New DataSet()
				ReflectAdapterData.Fill(oDataSet, TableName)
				ReflectAdapterData.Dispose()
				Return oDataSet
			Catch ex As Exception
				HttpContext.Current.Response.Write("<error>")
				HttpContext.Current.Response.Write("<message>" & ex.Message & "</message>")
				HttpContext.Current.Response.Write("<source>" & ex.Source & "</source>")
				HttpContext.Current.Response.Write("<error>")
				Return ""
			End Try
		End Function

		Public Shared Function GetDataRow(ByVal sGetTable As String, ByVal sFilter As String, ByVal sRequestedParam As String, Optional ByVal PrimaryKeySelect As String = "", Optional ByVal isHasRows As Boolean = False, Optional ByVal ShowSqlString As Boolean = False) As String
			Dim sSqlString As String
			Dim oGetData As Object
			sSqlString = "SELECT " & sRequestedParam & " FROM " & sGetTable & " " & sFilter & ""
			Try
				oGetData = PublicDataReader(sSqlString, errFollowCode)
				If ShowSqlString = True Then
					Return sSqlString
				ElseIf isHasRows = True Then
					If oGetData.HasRows = True Then
						Return True
					Else
						Return False
					End If
					Return oGetData.Item("sTotalRecord")
				ElseIf oGetData.HasRows = True Then
					If PrimaryKeySelect <> "" Then
						Return oGetData.Item(PrimaryKeySelect)
					Else
						Return oGetData.Item(sRequestedParam)
					End If
				Else
					Return ""
				End If
				oGetData.Dispose()
			Catch ex As Exception
				Return ""
				HttpContext.Current.Response.Write("<error>")
				HttpContext.Current.Response.Write("<message>" & ex.Message & "</message>")
				HttpContext.Current.Response.Write("<source>" & ex.Source & "</source>")
				HttpContext.Current.Response.Write("<error>")
			End Try
		End Function

		Public Function Save(Optional ByVal ShowSqlString As Boolean = False) As String
			Dim sSqlString As String
			Dim oSaveData As Object
			If Filter <> "" Then
				sSqlString = "UPDATE " & Table & " SET " & DataRowNames.Substring(1) & " " & Filter & ""
			Else
				sSqlString = "INSERT INTO " & Table & " (" & DataRowNames.Substring(1) & ") VALUES (" & DataRowValues.Substring(1) & ")"
			End If
			oSaveData = PublicDataReader(sSqlString, errFollowCode)
			Try
				If ShowSqlString = True Then
					Return sSqlString
				Else
					Return oSaveData.RecordsAffected
					oSaveData.Dispose()
				End If
			Catch ex As Exception
				Return 0
				HttpContext.Current.Response.Write("<error>")
				HttpContext.Current.Response.Write("<message>" & ex.Message & "</message>")
				HttpContext.Current.Response.Write("<source>" & ex.Source & "</source>")
				HttpContext.Current.Response.Write("<error>")
			End Try
		End Function

		Public WriteOnly Property DataItem(ByVal sRowName As String)
			Set(ByVal sRowValue)
				Try
					If Filter <> "" Then
						If IsNumeric(sRowValue) = True Then
							DataRowNames = "" & DataRowNames & "," & sRowName & "='" & sRowValue.ToString & "'"
						Else
							If Not sRowValue <> "" Then
								sRowValue = ""
							End If
							DataRowNames = "" & DataRowNames & "," & sRowName & "='" & Trim(sRowValue) & "'"
						End If
					Else
						DataRowNames = "" & DataRowNames & "," & sRowName & ""
					End If
					If IsNumeric(sRowValue) = True Then
						DataRowValues = "" & DataRowValues & ",'" & sRowValue.ToString & "'"
					Else
						If Not sRowValue <> "" Then
							sRowValue = ""
						End If
						DataRowValues = "" & DataRowValues & ",'" & Trim(sRowValue & "'")
					End If
				Catch ex As Exception
					HttpContext.Current.Response.Write("<error>")
					HttpContext.Current.Response.Write("<message>" & ex.Message & "</message>")
					HttpContext.Current.Response.Write("<source>" & ex.Source & "</source>")
					HttpContext.Current.Response.Write("<error>")
				End Try
			End Set
		End Property
	End Class
%>

E-ticaret'te "Başarısız" olmanın 6 kuralı


16. Aralık 2011 22:31 by Serkan in E-ticaret, Girişimcilik  //  Tags: , ,   //   Yorumlar (0)
Bugüne dek işim gereği yüzlerce sanal mağazaya hizmet vermiş, bir o kadar site yöneticisi ile görüşme fırsatı bulmuş biri olarak başarılı, başarısız, başlangıçta başarılı fakat sonradan büyümeyi hazmedemeyip çuvallayan onlarca girişime şahit olmakla kalmayıp, birçoğunun bu inişli çıkışlı süreçlerinde bizzat yer aldım. Gerek ücretli bir e-ticaret altyapısı kullanan, gerek ücretsiz yazılımları tercih eden sitelerden gözlemlediklerim bana başarılı olmaktan ziyade nasıl başarısız olunabileceğini gösterdi. Sanal mağazaların nasıl başarısız olunabileceği, detaylı olarak kavranırsa başarıya gitmek için bütün engeller kolayca kaldırılabilir diye düşünüyorum. Hemen gelelim bu maddelere:
 
1-      Girişimci: Deneyelim, belki tutar!
Sonuç: Tutmaz, çünkü baştan kumar oynamak, işi şansa bırakmaktır ki bu sadece işin kolayına kaçmaktır. İyi bir iş planı, zaman programlaması, ekip, finansman ve operasyonel yönetim kabiliyeti yoksa tutmaz. Olsaydı zaten kumar oynanmazdı ve en baştan inançla işe başlanırdı. İnanç ve tutkuyla bir işe başlanmadıktan sonra hiç başlanmaması daha iyi.
 
2-      Girişimci: Arama motorları konusunda çok iyiyim hep üstte çıkar ürünlerimi satarım.
Sonuç: Hüsran. Google sayesinde günde binlerce TL kazanıp, sonraki aylarda bu inorganik büyümeye sırtını yaslayıp, ekibini büyüten, kazandığını işine yatırıp, ofisini lüks hale getiren ve ne yazık ki yine Google’ın tepetaklak edip sonuçlarda bile çıkamayarak neye uğradığını şaşıran girişimciler listemde ikinci sıradalar. Kural çünkü çok basit: Kolay olsa herkes yapardı.

3-      Girişimci: Beni Bu Sektörde Herkes Bilir, Reklama İhtiyacım Yok
Sonuç: E-ticareti, reel ticaretle karıştırıp kendisini a dan z ye herkesin tanıdığına inanan kesimdir bu kitle. Evet rakiplerinin tamamı bilir, tanır ama gelin görün ki e-ticaretteki sadakat oranı gerçek ticaretle kıyaslanamayacak kadar düşüktür. Mağazanıza gelen bir müşteriye çay ikram edersiniz, hoş sohbet edersiniz ve bir sonraki satış için müşterinizin gözünde artı puanlar alabilirsiniz. Bu mağazanızda gerçektende işe yarar müşterinizi kazanırsınız. Fakat gelin görün ki internette işler öyle değil. Eğer gerçekten en iyisi değilseniz, tüketici bir sonraki alışverişte rakibinizin cazip fiyatlarına kanıp sizi aldatabilir ve rakibinizden alışveriş yapabilir. Bu nedenle “bana herkes nasıl olsa gelir” demeyin, onları siz mağazanıza, sanal mağazanıza davet edin, özel olduğunu müşterinize hissettirin, onu kazanın.

4-      Girişimci: Tek Rakibim Türk Hava Yolları!
Sonuç: Birkaç bin TL’ye e-ticaret sitesi(e-ticareti bedavaya getirmeye çalışan e-cimri kitlenin karşısında, bu kitleyi cömert e-girişimci diye adlandırıyorum), ssl sertifikası, sanalpos aldınız. Ürünler ve içerikler girildi, şık bir arayüz tasarımla sanal mağaza yayın hayatına başladınız.Call centera birkaç personel aldınız. Muhasebesi, deposu, operasyonuyla sistemi kurmayı başardınız. Özellikle ilk defa e-ticaret yapan kesimde bu tür durumlara şahit oluyordum.  Durum ise şu: Satışlar geliyor, büyüyor ve her geçen gün biraz daha kazanıyor. İşte girişimcilerin %50 ye yakın bir kısmı sitesini açıp, bir müddet işletip satış yaptıktan sonra rakip olarak kendisine en tepedekilerden birisini, örneğin hepsiburada.com’u alıyor! “Benim ondan ne eksiğim var? Sepet, kampanya, taksit, katalog, müşteri hizmetleri her şey var” denilerek işin sadece site kısmında bittiğini düşünen bu kesimin sonu yine ne yazık ki ya hüsranla yada beklentilerin karşılanamamasıyla son buluyor. O kadar kolay olsaydı büyük siteler altyapılarına ciddi miktarlarda yatırımlar yapmazdı değil mi?

5-      Girişimci: Ne kadar XML Tedarikçisi O Kadar Çok Satış
Sonuç: Çok tedarikçi=Çok ürün=Daha çok Google indeksi=daha çok ziyaret=daha çok ziyaretçi=daha çok müşteri
Bu şekilde bir varsayımla hareket eden sitelerin gözden kaçırdığı nokta ise, sitesinde bulunan ve XML ile gelen ürünün belki de yüzlerce farklı e-ticaret sitesinde bulunduğu, Google teknolojisinin ise henüz bir sayfada 10 adet sonucu yani 10 adet siteyi gösterebildiğidir. Sizin kolayca sitenize entegre olan bu ürünler aynı anda sizin gibi yüzlerce sitesinde de olabilir. Sonuç olarak istediğiniz kadar SEO durumunuz iyi olsun, arama motorlarının kopya içeriği sevmediğini varsayarsak bu eşitlik çoğu zaman ters tepecektir. Google’a güvenerek yolculuğa çıkmayın.

6-      Girişimci: Ücretsiz E-ticaret Yazılımıyla Marka Olabilirim
Sonuç: E-ticarette marka olmak istiyorum derseniz bunun ancak 2 yolu olduğunu söyleyebilirim. İlk yolu ücretli olarak satılan e-ticaret altyapıları(Hemenal,Ideasoft,Neticaret,Platinmarket gibi sağlayıcılar) ile bu yolculuğa çıkmak. Diğer yol ise daha maliyetli bir yol kendi ekibinizle veya özel hazırlatacağınız sistemlerle. Sermayem iyi diyorsanız 2. Yol size özgünlük ve esneklik kazandıracağından tercihiniz bu yönde olsun.
 

Herşey bir ''Hello World" ile başladı


14. Aralık 2011 20:58 by Serkan in Girişimcilik, Hayata Dair  //  Tags: , , , , ,   //   Yorumlar (0)
İlk bilgisayarla tanışmamı daha dün gibi hatırlıyorum. O siyah ekranlı günlerden bugünlere teknoloji gerçekten o kadar hızlı ilerlemiş ki bilgisayarla büyüyen ben bile buna inanamıyorum.
 
O zamanlar henüz 13 yaşındaydım ve şu an neredeyse hayatımın tamamını kapsayan bilgisayarla çocukluk arkadaşım sayesinde tanışmıştım.
O zamanları hatırlıyorum da, her okuldan sonra yemek dahi yemeden hemen çocukluk arkadaşımla bilgisayarın başına geçip saatlerce oyun oynardık. Derken Atari girdi hayatıma. Gözlerimiz kıpkırmızı olana, ellerimiz artık joystickten yapışana kadar televizyon ekranının karşısına çakılı kalırdık. Sadece 2 ay oynayabildik ve artık sıkıldığımızı hissetmiştik. Oyun oynamaktan sıkıldığımız gün programlama dünyasına adım attığımız günde oldu. İlk başlarda eğlenceli olması için site işine hazır sitelerle start vermiştik. O zamanlar Mynet’in ücretsiz olarak sunduğu .sitemynet.com uzantılı alan adları ve hazır site servisi vardı. İlk deneyimimizi bu hazır sitelerle yaşadık. Üretmenin verdiği hazzı bir defa tattınız mı artık o sizin peşinizi bırakmıyor. Devamı ise basit html siteler hazırlayarak geldi. Çok keyif alıyorduk bu çalışmaları yaparken. Yaptığımız siteleri ise tahmin edersiniz. Sağ üst köşede analog bir saat, hemen altında bir takvim, altında dost siteler ve şimdi baktığımda saçma denilebilecek salt kalıplarla(***Siteme Hoş Geldiniz****. Aradığınız her şey burada. Hiç çıkmak istemeyeceksiniz. vs vs) oluşturulmuş bir site. O zamanlar Brinkster, domaindlx ve cjb.net gibi ücretsiz hizmet sunan servis sağlayıcıları bizim gözümüzde birer ilahtı. Bununla birlikte beklentilerimizde artıyordu. Arge ruhumuzda geliyor sanırım.
Keşfetmek istiyordum fakat neyi nasıl yapacağım konusunda hiçbir fikrim yoktu.
Yıl 2002. Bir gün gittiğimiz internet cafede çalışan bir büyüğümüz yardımımıza hemen yetişti. “Nereye gideceğini bilmiyorsan gittiğin yolun bir önemi yoktur” modunda kaynakları araştırıyor iken üstadımız Sedat Öztunalı nereye gideceğini bilmeyen bizi bu teknolojilerle tanıştırdı. Gitmemiz gereken yolu bize gösterdi  ve hayatıma yön verecek olan ASP programlama dili ile tanışmamıza vesile oldu. İlk eğitim kaynağımız Türkiye’nin bu alandaki ilahlarından diyebileceğim Hakkı Öcal’ın hazırladığı elektronik kitap oldu.(Aynı zamanda yazılım eğitimi amaçlı okuduğum son kitapta oldu). Kitapçık bittikten sonra bu yola başladığım ve “Evet budur” dediğim ilk program komutu ise ,
<% Response.Write “Hello World” %>
oldu ve o günden bu güne çok yol kat ettik.
Bugün bana ilk ateşi veren o sihirli kelimenin ardından çok yol kat ettiğimi, bu yolculuğun ise hiç bitmeyeceğide açıkça görülüyor. Steve Jobs’un dediği gibi: Asıl ödül, yolculuğun kendisidir.
 

Merhaba
Türkiye'de e-ticaretin gelişmesine ve 700'den fazla sanal mağazaya alt yapı hizmeti sunarken edindiğim tecrübeleri paylaştığım kişisel blogumu keyifle okumanızı umuyorum.