View Full Version : طریقه برخورد با Connection در ADO
S.Azish
چهارشنبه 19 شهریور 1382, 13: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, 21: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, 14: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
کم حوصله
سه شنبه 25 شهریور 1382, 00:31 صبح
سلام
دوست عزیز آقای آذیش
مشکلات خطا دهی برنامه حل شد ولی حالا دوتا مشکل دیگه دارم اگر جسارت نباشه
1 زمانی که رکوردستی با این حالت باز بشه دیگر امکان ویرایشی نداره یعنی نمیشه اضافه و یا حذف کرد ولی عملا در دیتابیس هیچ اتفاقی نمی افتد یعنی رکوردست ما ارتباطش را با دیتابیس از دست میدهد خوب این خیلی بده چون من می خواهم عملیات ویرایشی روی اطلاعاتم انجام بشه
2 این فانکشن ExecuteSQL کارش چیه میشه مختصر توضیحی بدین
با تشکر :oops:
S.Azish
چهارشنبه 26 شهریور 1382, 13: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 استفاده کنید.
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.