PDA

View Full Version : طریقه برخورد با Connection در ADO



S.Azish
چهارشنبه 19 شهریور 1382, 12:49 عصر
درست اینه که هیچ وقت هیچ کانکشنی رو باز نگه نداشت و هر زمان که لازم داشتید همون زمان Connection رو باز کنید و همون زمان هم ببندید شاید بگید این روش کند میشه ولی در اصل اینطور نیست و OLEDB یا ODBC از تکنیکی استفاده می کنند به نام Connection Pooling که این کاهش سرعت رو جبران میکنه. هر زمان نیاز به یک Recordset یا انجام یک دستور SQL داشتید میتونید مثل روش زیر اونو بگیرید



Option Explicit
Private connectionString As String

Public Function GetRecordSet(ByRef rsResult As ADODB.Recordset, ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

If rsResult Is Nothing Then rsResult = New ADODB.Recordset
If rsResult.State = adStateOpen Then rsResult.Close

rsResult.Open CommandText, cn
If Not (rsResult.EOF Or rsResult.BOF) Then
GetRecordSet = rsResult.RecordCount
End If

'Unmark this line if you don't need connected recordsets
'rsResult.ActiveConnection = Nothing

cn.Close
Set cn = Nothing
'
End Function

Public Function ExecuteSQL(ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection
Dim lngTemp As Long

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

Call cn.Execute(CommandText, lngTemp)
ExecuteSQL = lngTemp

cn.Close
Set cn = Nothing
'
End Function

کم حوصله
یک شنبه 23 شهریور 1382, 20:48 عصر
سلام
استاد عزیز آقای اذیش با عرض معذرت من چند تا مشکل با زیربرنامه های شما داشتم که اگر حمل بر جسارت نباشد عرض می کنم
1 در خط 8 برنامه شما چنین نوشتید


If rsResult Is Nothing Then rsResult = New ADODB.Recordset

که چنین خطایی می دهد


invalid use of the property

که فکر می کنم علتش نداشتن کلمه set باشد


If rsResult Is Nothing Then Set rsResult = New ADODB.Recordset

2 زمانی که من می خواهم رکوردست بازشده توسط این زیربرنامه را بخوانم چنین پیغامی می دهد


operation is not allowed when the object is closed

که من علتش را نفهمیدم ولی با برداشتن این دوخط برنامه درست می شود


cn.Close
Set cn = Nothing

که فکر می کنم منطقی نباشد
3 زیر برنامه دوم شما را اصلا متوجه نشدم چه کار می کند اگر ممکن است مختصر توضیحی بدهید
4 علت استفاده از این خط را هم نفهمیدم


If Not (rsResult.EOF Or rsResult.BOF) Then
GetRecordSet = rsResult.RecordCount
End If

و نهایتا چرا شما از function استفاده کرده و مقدار long را برمیگردانید مگر از تابع sub نمی شود استفاده کرد
در ضمن واقعا من را ببخشید چون خیلی کند ذهنم و اصلا نمی فهمم که چه جوری می شود و گرنه مزاحم شما نمی شدم :(
مرسی و متشکرم :oops:

S.Azish
دوشنبه 24 شهریور 1382, 13:50 عصر
دوست عزیز از چند باگ کوچیکی که داخل کدها بود عذر خواهی میکنم و از کد زیر استفاده کنید. من از Function استفاده میکنم و تعداد رکورد برگشتی توسط کانکشن رو برمیگردونم تا نیاز نباشه تو برنامه چک کنیم که آیا رکوردی وجود داره یا نه. یک مثال پائین زدم که موضوع رو مشخص میکنه



Option Explicit
Private connectionString As String

Public Function GetRecordSet(ByRef rsResult As ADODB.Recordset, ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

If rsResult Is Nothing Then Set rsResult = New ADODB.Recordset
If rsResult.State = adStateOpen Then rsResult.Close

rsResult.Open CommandText, cn
If Not (rsResult.EOF Or rsResult.BOF) Then
GetRecordSet = rsResult.RecordCount
End If

rsResult.ActiveConnection = Nothing

cn.Close
Set cn = Nothing
'
End Function

Public Function ExecuteSQL(ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection
Dim rsTemp As ADODB.Recordset

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

Set rsTemp = cn.Execute(CommandText)

If Not (rsTemp.EOF Or rsTemp.BOF) Then
ExecuteSQL = rsTemp.RecordCount
End If

cn.Close
Set cn = Nothing
'
End Function

Sub main()
'
connectionString = "your connection string here"
Form1.Show
'
End Sub


Option Explicit

Private Sub Form_Load()
'

Dim rsTemp As ADODB.Recordset


If GetRecordSet(rsTemp, "select * from tblTest") Then
MsgBox rsTemp.Fields(0)
End If

If ExecuteSQL("Update tblTest Set FName = 'something'") Then MsgBox "test"
'
End Sub

کم حوصله
دوشنبه 24 شهریور 1382, 23:31 عصر
سلام
دوست عزیز آقای آذیش
مشکلات خطا دهی برنامه حل شد ولی حالا دوتا مشکل دیگه دارم اگر جسارت نباشه
1 زمانی که رکوردستی با این حالت باز بشه دیگر امکان ویرایشی نداره یعنی نمیشه اضافه و یا حذف کرد ولی عملا در دیتابیس هیچ اتفاقی نمی افتد یعنی رکوردست ما ارتباطش را با دیتابیس از دست میدهد خوب این خیلی بده چون من می خواهم عملیات ویرایشی روی اطلاعاتم انجام بشه
2 این فانکشن ExecuteSQL کارش چیه میشه مختصر توضیحی بدین
با تشکر :oops:

S.Azish
چهارشنبه 26 شهریور 1382, 12:48 عصر
کلآ دو نوع Recordset وجود داره 1. Connected یا متصل به دیتابیس 2. Disconnected یا بدون اتصال به دیتابیس. Recordset های Connected توصیه نمیشن چراکه همیشه باید Connection رو برای اونا باز نگه داشت و زمانی که تعداد کاربرها بالا میره میتونه مشکل ساز باشه. بهتر همیشه طوری برنامه نویسی دیتابیس کنید که نیازی به این نوع Recordset نداشته باشید. بهر حال اگر نیاز به این نوع Recordset دارید خط های زیر رو حذف کنید



rsResult.ActiveConnection = Nothing

cn.Close
Set cn = Nothing


گاهی اوقات هست شما فقط نیاز دارید یک دستور SQL رو اجرا کنید و نیازی به یک Recordset ندارید مثل دستور های Update, Delete یا Insert برای این منظورها از ExecuteSQL استفاده کنید.