Üye Kayıt Üye Giriş

MS ACCESS DATABASE 'in ASP.net Uygulamalarda Efektif bir şekilde kullanımı & Singleton & Access DB Skeleton


MS ACCESS DATABASE 'in ASP.net Uygulamalarda Efektif bir şekilde kullanımı & Singleton & Access DB Skeleton

Bu makalemizde ASP.net uygulamalarında Access DB ile neler başarabileceğimizi, Access DB sınırlarını ve efektif bir şekilde kullanımını göreceğiz.

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 uygulamalarında (veya herhangi bir uygulamada) size sürekli ACCESS DB'yi kullanmamanız öğütlenir. Nedenleri genelde aynıdır; Çok veri girersen Access patlar, kaldıramaz, çok yavaş çalışır, sürekli hata verir. Eğer Access DB ile uğraşmışsanız, MS SQL veya MySQL e geçiş günlerinizi hatırlayınız..

ACCESS DB 'yi tüm limitleriyle test ettim, işte sonuçlar.

Artılar;

- 2GB 'ye kadar veriler ile (daha fazlasını test edemedim fakat çok ufak yavaşlamalar haricinde sorun olmayacağını söyleyebilirim) sorunsuz ve hızlı bir şekilde oynayabilirsiniz. Tabiki buradaki hız dan kasıt, kuracağınız SQL cümleciklerinin Uygulamanız ile doğru bir şekilde yönetilmesiyle mümkündür. Eğer sayfalama işlemleri için SQL cümleciğiniz "select * from" gibi bir ibare içeriyorsa, hangi DB yi kullanırsanız kullanın yavaş çalışacaktır. Ayrıca çoğu hosting şirketinin MS SQL (veya MySQL) sınırlarını 100/250/500 MB civarında tuttuğunu ve fazlası için ücret talep ettiğini hatırlatacak olursak, ACCESS DB yi seçmek için güzel bir neden daha sunmuş oluruz.

- Taşınabilirlik! Sadece kopyala ve yapıştır özellikleriyle uygulamanızı masaüstüne alabilir, sunucunuza kopyalayabilir, excel le oynar gibi tablolarla oynayabilir, silip/kopyalayıp/yapıştırabilirsiniz.

Eksiler;

- Aynı anda (concurrent) bağlantı sayısının 20'yi geçmemesi gerektiği belirtilmektedir. Aynı anda 21. kullanıcı diğer bir istek bitene kadar beklemek durumunda kalacaktır. Burada dikkat edilmesi gereken siteye 20 kişinin bağlanması değil, aynı anda gönderilen 20 istektir. Uygulamalarımda SQL cümlecikleri için gelen yanıtlar 1sn altındadır. Bir dakika içerisinde 60 kişi aynı anda istek gönderirse, saniye başına 1 kullanıcı düştüğünü hesaplarsak; 60x20 = 1200 , yani dakikada 1200 kullanıcıdan fazla kullanıcı sitenize giriyor ise; ACCESS DB KULLANMAYIN.

- Her ne kadar doğru SQL cümlecikleri ile ACCESS DB'den 1 sn altında yanıt alabilsek de, MS SQL, MySQL gibi uygulamalarda bu süre çok daha kısadır. Milisaniyelerle ifade edilen zamanlar sizin için kritik öneme sahipse ACCESS DB KULLANMAYIN.

Artıları Eksileri karşılaştırıp kullanıp kullanmama kararı size ait.

SQL 'e yeni giriş yaptığınızda şunun gibi çok örnek görürsünüz;

Bağlantı açılır --> Veri Çekilir --> Bağlantı kapatılır. Burada bağlantıyı kapatmanız mutlaka önerilir, çünkü sunucuyu meşgul etmemesi öğütlenir.

Fakat bu mantık yanlıştır. Singleton mimarisi bu yüzden kurulmuştur. Mantık olarak en az efor ile en efektif bir şekilde çalışma prensibini öğütlemektedir.

Biz şu şekilde çalışacağız;

Bağlantı açılır (daha önce açılmamışsa) --> Veri Çekilir --> Bağlantı kapatılmaz (Diğer kullanıcılarında tekrar açacağı şeyi neden kapatalım?)

Ayrıca belirtmekte fayda var, Access DB default olarak, MultiThread özelliği aktif edilmemiştir. Bağlantı Stringimize ;OLE DB Services=-1 ifadesini ekleyerek bunu aktif hale getireceğiz.

Sözü fazla uzatmadan Access DB Class'ımıza 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 'Boş değilse,

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 kaldı
Exit Sub
End If
Else
ConnOpen() 'objconn boş 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 kurtarıyoruz.
'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 'Kayıt Sayısı
'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 'Kayıt Sayısı
'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(*) değer toplamı (tek alan dönen) işlemler için kullanılır.
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, "'", "''") ' (') işareti
'TemizData = Replace(TemizData, Chr(34), Chr(148)) ' (") işareti (") ile
'TemizData = Replace(TemizData, Chr(39), Chr(146)) ' (') işaretini (') ile
'TemizData = Replace(TemizData, Chr(44), Chr(130)) ' (,) işaretini (‚) ile
TemizData = Replace(TemizData, Chr(34), """") ' (") işareti
TemizData = Replace(TemizData, "'", Chr(146)) ' (') işaretini (') ile


Return TemizData
End Function
Public Function DB_ReturnText(ByVal StrToClear)
If StrToClear = "" Then Exit Function
Dim TemizData = StrToClear
TemizData = Replace(TemizData, Chr(146), "'") ' (') işaretini (') ile
Return TemizData
End Function
End Class
Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER