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
%>
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.
İ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.