MS ACCESS DATABASE ‘in ASP.net Uygulamalarda Efektif bir sekilde kullanimi & Singleton & Access DB Skeleton

Bu makalemizde ASP.net uygulamalarinda Access DB ile neler basarabilecegimizi, Access DB sinirlarini ve efektif bir sekilde kullanimini görecegiz.

We’re going to see how we can effectively use MS Access DB for ASP.net applications, as well as the limits of Access DB and using Singleton on Access DB

ASP.net uygulamalarinda (veya herhangi bir uygulamada) size sürekli ACCESS DB’yi kullanmamaniz ögütlenir. Nedenleri genelde aynidir; Çok veri girersen Access patlar, kaldiramaz, çok yavas çalisir, sürekli hata verir. Eger Access DB ile ugrasmissaniz, MS SQL veya MySQL e geçis günlerinizi hatirlayiniz..

ACCESS DB ‘yi tüm limitleriyle test ettim, iste sonuçlar.

Artilar;

  • 2GB ‘ye kadar veriler ile (daha fazlasini test edemedim fakat çok ufak yavaslamalar haricinde sorun olmayacagini söyleyebilirim) sorunsuz ve hizli bir sekilde oynayabilirsiniz. Tabiki buradaki hiz dan kasit, kuracaginiz SQL cümleciklerinin Uygulamaniz ile dogru bir sekilde yönetilmesiyle mümkündür. Eger sayfalama islemleri için SQL cümleciginiz “select * from” gibi bir ibare içeriyorsa, hangi DB yi kullanirsaniz kullanin yavas çalisacaktir. Ayrica çogu hosting sirketinin MS SQL (veya MySQL) sinirlarini 100/250/500 MB civarinda tuttugunu ve fazlasi için ücret talep ettigini hatirlatacak olursak, ACCESS DB yi seçmek için güzel bir neden daha sunmus oluruz.
  • Tasinabilirlik! Sadece kopyala ve yapistir özellikleriyle uygulamanizi masaüstüne alabilir, sunucunuza kopyalayabilir, excel le oynar gibi tablolarla oynayabilir, silip/kopyalayip/yapistirabilirsiniz.
.

Eksiler;

  • Ayni anda (concurrent) baglanti sayisinin 20’yi geçmemesi gerektigi belirtilmektedir. Ayni anda 21. kullanici diger bir istek bitene kadar beklemek durumunda kalacaktir. Burada dikkat edilmesi gereken siteye 20 kisinin baglanmasi degil, ayni anda gönderilen 20 istektir. Uygulamalarimda SQL cümlecikleri için gelen yanitlar 1sn altindadir. Bir dakika içerisinde 60 kisi ayni anda istek gönderirse, saniye basina 1 kullanici düstügünü hesaplarsak; 60×20 = 1200 , yani dakikada 1200 kullanicidan fazla kullanici sitenize giriyor ise; ACCESS DB KULLANMAYIN.
  • Her ne kadar dogru SQL cümlecikleri ile ACCESS DB’den 1 sn altinda yanit alabilsek de, MS SQL, MySQL gibi uygulamalarda bu süre çok daha kisadir. Milisaniyelerle ifade edilen zamanlar sizin için kritik öneme sahipse ACCESS DB KULLANMAYIN.

Artilari Eksileri karsilastirip kullanip kullanmama karari size ait.

SQL ‘e yeni giris yaptiginizda sunun gibi çok örnek görürsünüz;

Baglanti açilir –> Veri Çekilir –> Baglanti kapatilir. Burada baglantiyi kapatmaniz mutlaka önerilir, çünkü sunucuyu mesgul etmemesi ögütlenir.

Fakat bu mantik yanlistir. Singleton mimarisi bu yüzden kurulmustur. Mantik olarak en az efor ile en efektif bir sekilde çalisma prensibini ögütlemektedir.

Biz su sekilde çalisacagiz;

Baglanti açilir (daha önce açilmamissa) –> Veri Çekilir –> Baglanti kapatilmaz (Diger kullanicilarinda tekrar açacagi seyi neden kapatalim?)

Ayrica belirtmekte fayda var, Access DB default olarak, MultiThread özelligi aktif edilmemistir. Baglanti Stringimize ;OLE DB Services=-1 ifadesini ekleyerek bunu aktif hale getirecegiz.

Sözü fazla uzatmadan Access DB Class’imiza geçiyorum..

.
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.OleDb
Imports System.Configuration
Public Class db_acc_v20
Public Shared ServerPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath
Private Const DBPath = "|DataDirectory|database_fs1_2011.09.19.mdb" 'App_Data Klasörü
Private Const DBPass = "sifreniz"
Private Const ConnSTR As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + DBPath & ";Jet OLEDB:Database Password=" & DBPass & ";OLE DB Services=-1"
'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:\database.mdb;Jet OLEDB:Database Password=extremeteam
Public Shared objConn As OleDbConnection
Private objCmd As OleDbCommand
Private Trans As OleDbTransaction
Private Const strConnString As String = ConnSTR

Dim dtReader As OleDbDataReader
Public Sub New()
If objConn IsNot Nothing Then 'Bos degilse,

If objConn.State <> Data.ConnectionState.Connecting Then
ConnOpen()
ElseIf objConn.State <> Data.ConnectionState.Broken Then
ConnOpen()
ElseIf objConn.State <> Data.ConnectionState.Executing Then
ConnOpen()
ElseIf objConn.State <> Data.ConnectionState.Fetching Then
ConnOpen()
ElseIf objConn.State <> Data.ConnectionState.Closed Then
ConnOpen()
Else 'zaten tek open kaldi
Exit Sub
End If
Else
ConnOpen() 'objconn bos ise aç
End If
End Sub
Sub ConnOpen()
objConn = New OleDbConnection
With objConn
.ConnectionString = strConnString
.Open()
End With
End Sub
Public Sub ConnClose()

If dtReader IsNot Nothing Then
dtReader.Close()
dtReader = Nothing
End If

If objConn IsNot Nothing Then
objConn.Close()
End If

End Sub

Public Function DB_SelectSTR(ByVal TableName, ByVal ColumnNames, Optional ByVal WhereStr = "", Optional ByVal OrderBy = "")
'QueryType = DataReader | DataSet | DataTable
Dim SQLStr = "SELECT " & ColumnNames & " FROM " & TableName
If WhereStr <> "" Then SQLStr = SQLStr & " WHERE " & WhereStr & ""
If OrderBy <> "" Then SQLStr = SQLStr & " ORDER BY " & OrderBy & ""
Return SQLStr
End Function

Public Function DB_InsertSTR(ByVal TableName, ByVal ColumnNames, ByVal Values)
Dim SQLStr = "INSERT INTO " & TableName & " (" & ColumnNames & ") VALUES " & "(" & Values & ")"
Return SQLStr

''############ USAGE ###############################################
'Dim Q(10)

'For i = 1 To 10
' Q(i) = MyDB.DB_ClearText(Q(i))
'Next

'Dim TblName = "referrals"
'Dim ColNames = "link,[page],[datetime]"
'Dim ValNames = "'" + Q(1) + "','" + Q(2) + "'," + Q(3) + ""

'Dim SqlStr = MyDB.DB_InsertSTR(TblName, ColNames, ValNames)
'MyDB.QueryExecuteNonQuery(SqlStr)
End Function
Public Function DB_UpdateSTR(ByVal TableName, ByVal ColumnNames, ByVal Values, Optional ByVal WhereStr = "NO")
Dim Columnlar(), Valueler(), SETStr, i

Columnlar = ColumnNames.ToString.Split("¦¦")
Valueler = Values.ToString.Split("¦¦")

If UBound(Columnlar) <> UBound(Valueler) Then
MsgBox("Column Sayisi Value Sayisina Esit Degil")
Exit Function
End If

For i = 0 To UBound(Columnlar)
If Trim(Columnlar(i).ToString) <> "" Then
SETStr = SETStr & Columnlar(i).ToString & "=" & Valueler(i).ToString & ","
End If
Next
SETStr = Left(SETStr, (Len(SETStr) - 1)) 'Son virgülden kurtariyoruz.
'MsgBox(SETStr)

Dim SQLStr

If WhereStr = "NO" Then
SQLStr = "UPDATE " & TableName & " SET " & SETStr & ""
Else
SQLStr = "UPDATE " & TableName & " SET " & SETStr & " WHERE " & WhereStr & ""
End If
Return SQLStr

''############ USAGE ###############################################
'Dim Q(10)
'For i = 1 To 10
' Q(i) = MyDB.DB_ClearText(Q(i))
'Next
'Dim TblName = "users"
'Dim ColName = "[email]¦¦[password]¦¦[name]¦¦[surname]"
'Dim ValName = "'" & Q(1) & "'¦¦'" & Q(2) & "'¦¦'" & Q(3) & "'¦¦'" & Q(4) & "'"
'Dim WhereStr = "[id]=" & Session("UserId") & ""

'Dim SqlStr = MyDB.DB_UpdateSTR(TblName, ColName, ValName, WhereStr)
'MyDB.QueryExecuteNonQuery(SqlStr)
End Function
Public Function DB_DeleteSTR(ByVal TableName, ByVal WhereStr, Optional ByVal ColumnNames = "*")
Dim SQLStr = "DELETE " & ColumnNames & " FROM " & TableName & " WHERE " & WhereStr
Return SQLStr
End Function

Public Function QueryDataReader(ByVal strSQL As String) As OleDbDataReader
objCmd = New OleDbCommand(strSQL, objConn)
dtReader = objCmd.ExecuteReader()
Return dtReader '*** Return DataReader ***'

'############ USAGE ###############################################
'Dim TblName = "cards"
'Dim ColName = "id, word, tabu1, tabu2, tabu3, tabu4, tabu5, difficulty"
'Dim SqlStr = MyDB.DB_SelectSTR(TblName, ColName, , OrderBy)
'Dim DR As System.Data.OleDb.OleDbDataReader
'DR = MyDB.QueryDataReader(SqlStr)

'Dim DataTable1 As New System.Data.DataTable()
'DataTable1.Load(DR)
'DR.Close()

'ListView1.DataSource = DataTable1
'ListView1.DataBind()

End Function

Public Function QueryDataSet(ByVal strSQL As String) As DataSet
Dim ds As New DataSet
Dim dtAdapter As New OleDbDataAdapter

objCmd = New OleDbCommand
With objCmd
.Connection = objConn
.CommandText = strSQL
.CommandType = CommandType.Text
End With
dtAdapter.SelectCommand = objCmd
dtAdapter.Fill(ds)
Return ds '*** Return DataSet ***'

'############ USAGE ###############################################
'Dim TblName = "cards"
'Dim ColName = "id, word, tabu1, tabu2, tabu3, tabu4, tabu5, difficulty"
'Dim SqlStr = MyDB.DB_SelectSTR(TblName, ColName, , OrderBy)
'Dim DS As System.Data.DataSet
'DS = MyDB.QueryDataSet(SqlStr)
'ListView1.DataSource = DS.Tables(0).DefaultView
'ListView1.DataBind()
'Dim MySTR = "", i
'Dim KS = ds.Tables(0).Rows.Count 'Kayit Sayisi
'If KS > 0 Then
' For i = 0 To KS - 1
' MySTR = MySTR & ds.Tables(0).Rows(i)("link") & ","
' Next
'End If
'ds.Dispose()

End Function

Public Function QueryDataTable(ByVal strSQL As String) As DataTable
Dim dtAdapter As OleDbDataAdapter
Dim dt As New DataTable

dtAdapter = New OleDbDataAdapter(strSQL, objConn)
dtAdapter.Fill(dt)
Return dt '*** Return DataTable ***'


'############ USAGE ###############################################
'Dim TblName = "cards"
'Dim ColName = "id, word, tabu1, tabu2, tabu3, tabu4, tabu5, difficulty"
'Dim SqlStr = MyDB.DB_SelectSTR(TblName, ColName, , OrderBy)

'Dim DT As System.Data.DataTable
'DT = MyDB.QueryDataTable(SqlStr)

'Dim MySTR = "", i
'Dim KS = DT.Rows.Count 'Kayit Sayisi
'If KS > 0 Then
' For i = 0 To KS - 1
' MySTR = MySTR & DT.Rows(i)("link") & ","
' Next
'End If
End Function

Public Function QueryExecuteNonQuery(ByVal strSQL As String) As Boolean

Try
objCmd = New OleDbCommand()
With objCmd
.Connection = objConn
.CommandType = CommandType.Text
.CommandText = strSQL
End With
objCmd.ExecuteNonQuery()
Return True '*** Return True ***'
Catch ex As Exception
Return False '*** Return False ***'
End Try

'############ USAGE ###############################################
'Dim TblName = "cards"
'Dim ColName = "id, word, tabu1, tabu2, tabu3, tabu4, tabu5, difficulty"
'Dim SqlStr = MyDB.DB_SelectSTR(TblName, ColName, , OrderBy)
End Function

Public Function QueryExecuteScalar(ByVal strSQL As String) As Object 'Burada id=2 veya max(*) deger toplami (tek alan dönen) islemler için kullanilir.
Dim obj As Object

Try
objCmd = New OleDbCommand()
With objCmd
.Connection = objConn
.CommandType = CommandType.Text
.CommandText = strSQL
End With
obj = objCmd.ExecuteScalar() '*** Return Scalar ***'
Return obj
Catch ex As Exception
Return Nothing '*** Return Nothing ***'
End Try

''############ USAGE ###############################################
'Dim TblName = "portal_conf"
'Dim ColName = "conf_value"
'Dim WhereSTR = "conf_name='lang'"

'Dim SqlStr = MyDB.DB_SelectSTR(TblName, ColName, WhereSTR)
'Session("lang") = MyDB.QueryExecuteScalar(SqlStr)
'lang_table = "translation_" & Session("lang")
End Function

Public Function TransStart()

Trans = objConn.BeginTransaction(IsolationLevel.ReadCommitted)
End Function

Public Function TransExecute(ByVal strSQL As String) As Boolean
objCmd = New OleDbCommand()
With objCmd
.Connection = objConn
.Transaction = Trans
.CommandType = CommandType.Text
.CommandText = strSQL
End With
objCmd.ExecuteNonQuery()
End Function

Public Function TransRollBack()
Trans.Rollback()
End Function

Public Function TransCommit()
Trans.Commit()
End Function

Public Function TarihForDB(ByVal DateToConvert)
Dim DT As Date, MyDate
If Len(DateToConvert) = 4 Then
MyDate = "#" & DateToConvert & "-01-01#"
Return MyDate
Exit Function
End If

DT = Convert.ToDateTime(DateToConvert)
MyDate = DT.ToString("#yyyy-MM-dd HH:mm:ss#")


Return MyDate
End Function
Public Function DB_ClearText(ByVal StrToClear)
If StrToClear = "" Then Exit Function
Dim TemizData = Trim(StrToClear)
'TemizData = Replace(TemizData, "'", "''") ' (') isareti
'TemizData = Replace(TemizData, Chr(34), Chr(148)) ' (") isareti (") ile
'TemizData = Replace(TemizData, Chr(39), Chr(146)) ' (') isaretini (') ile
'TemizData = Replace(TemizData, Chr(44), Chr(130)) ' (,) isaretini (‚) ile
TemizData = Replace(TemizData, Chr(34), """") ' (") isareti
TemizData = Replace(TemizData, "'", Chr(146)) ' (') isaretini (') ile


Return TemizData
End Function
Public Function DB_ReturnText(ByVal StrToClear)
If StrToClear = "" Then Exit Function
Dim TemizData = StrToClear
TemizData = Replace(TemizData, Chr(146), "'") ' (') isaretini (') ile
Return TemizData
End Function
End Class

. Microsoft’un neden Access DB gibi kullanisli bir uygulamayi gelistirmeyi biraktigini anlamak mümkün degil.

Ekli DEMO’yu incelemeyi unutmayin.

Happy programming.

Serkan Bal Bilg. Müh. serkanbal.com | extreme software
DEMO LINK: WordPressDotNet-v0,9,0,0.zip

Tags:

6 thoughts on “MS ACCESS DATABASE ‘in ASP.net Uygulamalarda Efektif bir sekilde kullanimi & Singleton & Access DB Skeleton

  • Osman kardes söyle kullan;

    Önce access db yi App_Data klasörü altina kopyala,

    DB Path ini ve sifresini asagidaki gibi belirle,

     

    Public Const DBPath = "|DataDirectory|hc_data_2012.05.17.mdb"

  •  

    2-) Bu proje normal olarak çalistigi için veritabanina kayit yapabiliyor. dolayisi ile birinci sorun çözülürse ben yonetim kismina bir buton koyup excel’e aktar deyip veritabanindaki bilgileri excel’e aktarmak istiyorum. Butona tiklayinca ya bir yere excel seklinde kayit yapacak yada tiklar tiklamaz excel’i açarak veritabanindaki belirledigim tablonun içindeki bilgileri yazacak. Bunu nasil kodlayabilirim ?

    Ilgilenen arkadaslara simdiden çok tesekkür ederim saygilarimi sunarim…

  •  

    2-) Bu proje normal olarak çalistigi için veritabanina kayit yapabiliyor. dolayisi ile birinci sorun çözülürse ben yonetim kismina bir buton koyup excel’e aktar deyip veritabanindaki bilgileri excel’e aktarmak istiyorum. Butona tiklayinca ya bir yere excel seklinde kayit yapacak yada tiklar tiklamaz excel’i açarak veritabanindaki belirledigim tablonun içindeki bilgileri yazacak. Bunu nasil kodlayabilirim ?

    Ilgilenen arkadaslara simdiden çok tesekkür ederim saygilarimi sunarim…

  •  Merhabalar öncelikle iyi çalismalar ;

    Ben VB.Net ile proje gelistirdim daha dogrusu birseyler yapmaya çalistim. Benim sizlere iki sorum olacak ;

    1-) Bu projeyi kendi bilgisayarimda yaptigimda proje çalsiyor fakat sunucu ortaminda baglanti hatasi veriyor yani söyle = baglanti.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source=C:\Users\OsmanAli\documents\visual studio 2010\Projects\Dersane\Dersane\vt.mdb" yaptigim zaman kendi bilgisayarimda çalisiyor fakat sunucu ortaminda çalismiyor vt.mdb bulunamadi diyor. forumlara baktigimda ~/vt.mdb seklinde gösterilmis fakat yine hata veriyor.data source kismina vt yi genel olarak gösterebilecegimiz bir adres veya sekil var mi ? Yoksa sunucuya göre tekrar mi adres belirtmeliyim bütün hepsine ?

    2-) Bu proje normal olarak çalistigi için veritabanina kayit yapabiliyor. dolayisi ile birinci sorun çöz&

  • Sistemi run ettiginizde çalismaya baslayan Web sunucusunu kapatmalisiniz. Sag tik –> STOP.

  • merhabalar bende yeni yeni asp.net ögreniyorum projelerimde ms acces tercih ediyorum ama her defasinda veri tabani açik kaliyor open close yaptigim halde unun önüne geçmenin bir yolu varmi acaba ?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir