PDA

View Full Version : مشکل در بستن کانکشن ها



alizanganeh
جمعه 03 آذر 1391, 12:17 عصر
سلام دوستان

میخوام توی پروژم کد restore بانک رو بذارم
کد سالمه و هیچ مشکلی نداره

ولی من پروژم رو بصورت MDI Form ساختم ولی فرم restore رو mdi-child نکردم و قبل از اجرای فرم mdi اجرا میشه
ولی با اینکه فرم mdi اجرا نشده ، کدهای باز کردن بانک که توی form-load در فرم mdi هست ، اجرا میشن و اینطوری نمیشه restore کرد

چکار کنم واسه این؟

نمیدونم منظورمو خوب رسوندم یا نه :قلب:

meys34
جمعه 03 آذر 1391, 13:29 عصر
شما کدهای ریستور رو گذاشتید توی لود:

Private Sub Form_Load()
'کدهای restore
End Sub


میتونید اونارو پاک کنید و توی فرمتون یه تابع Public درست کنید و کد ها رو اونجا بریزید و موقع لزوم اون تابع رو اجرا کنید

Public Sub Restore_Codes()
'کدهای restore
End Sub

برای اجرا از این کد استفاده کنید:

Form1.Restore_Codes

alizanganeh
جمعه 03 آذر 1391, 13:38 عصر
نه عزیزم توی لود نذاشتم
کدهای باز شدن بانک رو تیو لود فرم mdi گذاشتم
قبل از باز شدن فرم mdi میتونید وارد فرم ری استور بشید و با کلیک روی دکمه ای ری استور اجرا میشه
من تست کردم
وقتی کدهای باز شدن بانک در لود فرم mdi رو پاک میکنم ری استور انجام میشه ولی وقتی کد ها باشن نمیشه

محسن واژدی
جمعه 03 آذر 1391, 14:20 عصر
سلام علیکم
کد باز شدن فرم restore را بصورت modal و پیش از کدهایی که بانک را بازمیکنن بگذارین (مثلا در ابتدای روال)، دراینصورت نباید پیش از بسته شدن فرم restore کانکشنی به بانک متصل بشه

موفق باشید

alizanganeh
جمعه 03 آذر 1391, 14:26 عصر
ممنون محسن جان
ولی من فکر کنم منظورم رو خوب نرسوندم

ببینید من یک فرم دارم برای restore کردن بانک که خودش فرم مادره و mdichild نیست
توی این فرم هیچ بانکی هم باز نمیشه
کدهای restore هم توی یک دکمه ی در این فرم نوشته شده

و یک فرم mdi هم دارم که مادر همه ی فرم های child هستش ولی فرم restore جزء اونا بحساب نمیاد

فرم restore قبل از اجرا شدن فرم mdi اجرا میشه ، پس نباید کدهای موجود در لود فرم mdi قبل از فرم restore اجرا یشن
ولی میشن

ینی در حالی که من اصلا وارد فرم mdi نشدم ، کدهای لدش اجرا میشن و بانک رو باز میکنن و دیگه restore که قبل از اون باز شده کار نمیکنه

محسن واژدی
جمعه 03 آذر 1391, 14:51 عصر
خواهش میکنم، روال زیر را همه اتصالهای فعال را میبندد، برای اینکه بسته شدن اتصال با موفقیت صورت بگیره بایستی فرم هم بسته بشه که در این کد هم اینگونه هست،

Sub CloseAllADOConnections()
On Error Resume Next
Dim fForm As Form, oCtrl
Dim bUF As Boolean
For Each fForm In Forms
For Each oCtrl In fForm.Controls
If TypeOf oCtrl Is Adodc Then
oCtrl.Recordset.Close
bUF = True
End If
Next 'oCtrl
If bUF Then Unload fForm
Next 'fForm
End Sub

البته در روال بالا فرض براین هست که اتصال همه فرمهایی که بانک را استفاده میکنند از طریق کنترل ADO است (نه متغیر کلاس و مثل این، که اگر اینطور هست بفرمائید تا روال را به نسبت تغییر بدیم) و فرض بعدی هم بر این گذاشته ایم که کنترل ADO موجود در هرفرم به بانک مورد نظر ما متصل است (چون این کد صرفنظر از اینکه کنترل به چه فایلی متصل است اونو میبنده)

بنظرم کد را بهتر است در دکمه ای که restore را شروع میکنه قرار بدهیم نه همزمان با باز شدن فرم بصورت خودکار اجرا شود (بنظرم از چند جهت مکان مناسب برای اجرای کد هم در دکمه restore است، یکی چون بسته شدن اتصال ها و همینطور فرمها ممکن است طول بکشه و صبرکاربر رو میطلبه بهتر هست همه اینها در زمان شروع بازیابی اتفاق بیافته تا برای کاربر اینطور تداعی نشود که برنامه کند است و دلیل دومی هم اگر در زمان باز شدن فرم کانکشن ها را ببندیم، ممکن هست کاربر پیش از شروع، از انجام بازیابی منصرف شود که در اینصورت ظاهراً بسته بودن فرمها و کانکشن ها ناخوشایند میاد)

همینطور پیشنهاد بعدی که دارم این هست که قبل از بسته کانکشن ها با یک پیام تائید بستن کانکشن ها و فرم ها را از کاربر بگیریم (که البته فکر میکنم اینکار را انجام داده اید)

موفق باشید

alizanganeh
جمعه 03 آذر 1391, 15:17 عصر
واقعا ممنون محسن جان

من برای اتصال بهب انک که sql 2000 هست از کنترل استفاده نکردم
با کد متصل شدم
و فکر کنم باید کد تغییر کنه
و اینکه من فرم خاصی ندارم برای بستن بجز فرم login و mdi-form
ینی فرم restore جایی قرار داره که هنوز به باز شدن فرمی نرسیده

و سالم اینه که آیا این کدهایی که دادید ، اگر 10 فرم باز باشد و در هرکدام چند کانکشن باشد ، همه رو میبنده ؟
ممنون مجددا

محسن واژدی
جمعه 03 آذر 1391, 18:12 عصر
متاسفانه روی این سیستم sql-server نصب نیست چک کنم انشاءا... توانستم بررسی میکنم یا سایر دوستان زحمتش را بکشن

در مورد سوال دوم بله کانکشن های موجود در همه فرمها را می بنده

موفق باشید

alizanganeh
جمعه 03 آذر 1391, 18:35 عصر
ممنون
ینی نمیتونید همینطوری کد بالا رو طوری تغییر بدید که کانکشنی که با کد متصل شده رو ببنده ؟

alizanganeh
شنبه 04 آذر 1391, 15:06 عصر
آقا چی شد؟
محسن جان نتونستی کد رو تغییر بدی داداش ؟

محسن واژدی
شنبه 04 آذر 1391, 16:01 عصر
نمیتونید همینطوری کد بالا رو طوری تغییر بدید که کانکشنی که با کد متصل شده رو ببنده ؟
سلام علیکم
ببخشید دیر به انجمن اومدم
چرا کانکشنی که با اعلان کد ایجاد کرده ایم را هم میتوانیم به اینصورت ببندیم، البته یکی دو شرط را باید رعایت کنیم: اولی اینکه اعلان ها Public باشند و شرط دوم برای راحتی کار بهتر است کانکشن های موجود در فرمها نام یکسان داشته باشند، Public بود کانکشن همونطور که خودتون هم مستحضرید برای دستیابی روالمون به اون لازم هست
بر فرض اینکه نام همه کانکشنها clsCN هست کد را بصورت زیر میتوانیم تغییر بدیم:
Sub CloseAllADOConnections()
On Error Resume Next
Dim fForm As Form
For Each fForm In Forms
fForm.clsCN.Recordset.Close
Unload fForm
Next 'fForm

End Sub

موفق باشید

alizanganeh
شنبه 04 آذر 1391, 18:46 عصر
داش مجین میشه یکم توضیح بدی که چطور باید از این کد استفاده کنم؟


من با این کد ها متغیر بانک و اشاره گر بانک رو ایجاد میکنم :

Dim db1 As New Connection
Dim Adodc1 As New Recordset


و اینم کدی برای اتصال کانکشن به بانک است :

db1.Open "provider=msdasql;driver={sql server};server=;id=;pwd=;database=taranom"



ممنون

محسن واژدی
شنبه 04 آذر 1391, 18:58 عصر
اعلان:
Dim db1 As New Connection
Public میکنیم:
Public db1 As New Connection
اگه نام همه اعلان ها در فرمها db1 هست میتوانیم روال را بصورت زیر ویرایش کنیم:

Sub CloseAllADOConnections()
On Error Resume Next
Dim fForm As Form
For Each fForm In Forms
fForm.db1.Close
Unload fForm
Next 'fForm

End Sub


البته نکته ای که وجود داره: روالی که نوشته ایم برای زمانی هست که فرم های زیادی داریم و در هرکدام کانکشنی تعریف کرده ایم، اینطور که در چند پست قبل فرمودین تنها فرم log-in و mdi-form هستند که به بانک متصل میشن، که در اینصورت به روال بالا احتیاجی نیست، فقط باید اعلان کانکشن های موجود در این فرمها رو عمومی (Public) و در فرم restore دو دستور مثل db1.Recordset.Close را اجرا کنیم تا اتصالهای بانک بسته بشه

موفق باشید

alizanganeh
یک شنبه 05 آذر 1391, 00:32 صبح
داش محسن بازم نشد
میگم این recordset برای اشاره گرد نیست ؟
بعد برای اتصال با کد فکر کنم نیاز به نوشتن recordset نباشه ها
اون برای کنترل ADO هستش
البته شما استادی ولی گفتم شاید اینطوری باشه
:قلب:

محسن واژدی
یک شنبه 05 آذر 1391, 15:04 عصر
داش محسن بازم نشد
میگم این recordset برای اشاره گرد نیست ؟
بعد برای اتصال با کد فکر کنم نیاز به نوشتن recordset نباشه ها
اون برای کنترل ADO هستش
البته شما استادی ولی گفتم شاید اینطوری باشه
:قلب:
خواهش میکنم ما شاگرد دوستانیم،
بله حق با شماست، چون بنده فقط نام کلاس را جایگزین Adodc1 کرده بودم متوجه ویرایش مابقی کد نبودم،
متشکرم کد ویرایش شد

alizanganeh
یک شنبه 05 آذر 1391, 20:50 عصر
خواهش میکنم عزیزم
ولی بازم نشد :لبخندساده:

alizanganeh
سه شنبه 07 آذر 1391, 00:02 صبح
محسن جان کجا رفتی داداش؟
موندم من هنوزاااا :افسرده:

محسن واژدی
سه شنبه 07 آذر 1391, 05:14 صبح
سلام علیکم
کاش نمونه سورسی ضمیمه میکردین تا انشاءا... سریعتر به نتیجه برسیم

alizanganeh
سه شنبه 07 آذر 1391, 19:24 عصر
راس میگی اینطوری بهتره

این کد restore :

کد داخل general :

Option Explicit

Dim oBackRest As backup_restore

Private Declare Function MoveFile _
Lib "kernel32" _
Alias "MoveFileA" (ByVal lpExistingFileName As String, _
ByVal lpNewFileName As String) As Long

Private Declare Function DeleteFile _
Lib "kernel32" _
Alias "DeleteFileA" (ByVal lpFileName As String) As Long

Private Declare Function CopyFile _
Lib "kernel32" _
Alias "CopyFileA" (ByVal lpExistingFileName As String, _
ByVal lpNewFileName As String, _
ByVal bFailIfExists As Long) As Long



کد داخل دکمه :


CD.ShowOpen
Set oBackRest = New backup_restore
Call oBackRest.Connect(".", Trim(""), Trim(""), True)
Call CopyFile(CD.filename, "c:\B.BAK", 0)
Call oBackRest.DropDatabase(DataBaseName.Text)
Call oBackRest.RestoreDatabaseFromFile(DataBaseName.Tex t, "c:\B.BAK")
Call DeleteFile("c:\B.BAK")



کافیه؟ یا چیزای بیشتری نیازه ؟

محسن واژدی
سه شنبه 07 آذر 1391, 19:52 عصر
پوزش میخوام، منظورم سورس فایل وی بی بود که شامل متغیرهای اتصال بانک و ... هست

alizanganeh
سه شنبه 07 آذر 1391, 20:22 عصر
این کد باز شدن بانک در فرم login :

db1.Open "provider=msdasql;driver={sql server};server=;id=;pwd=;database=taranom"

Adodc1.CursorLocation = adUseClient
Adodc1.Open "select * from Login", db1, adOpenDynamic, adLockOptimistic


که به بانک taranom و جدول login وصل میشه و در آخر unload me میزنم و بسته میشن
البته close هم کردمشون قبل از خروج ولی فرقی نکرد


در فرم mdi بانک بصورت زیر متصل میشه

db1.Open "provider=msdasql;driver={sql server};server=;id=;pwd=;database=taranom"


و به این حدول ها هم متصل میشه

Adodc1.CursorLocation = adUseClient
Adodc1.Open "select * from setting", db1, adOpenDynamic, adLockOptimistic


Adodc2.CursorLocation = adUseClient
Adodc2.Open "select * from Login", db1, adOpenDynamic, adLockOptimistic




Adodc3.CursorLocation = adUseClient
Adodc3.Open "select * from visit", db1, adOpenDynamic, adLockOptimistic






Adodc4.CursorLocation = adUseClient
Adodc4.Open "select * from alarm", db1, adOpenDynamic, adLockOptimistic




Adodc5.CursorLocation = adUseClient
Adodc5.Open "select * from pvisit", db1, adOpenDynamic, adLockOptimistic




Adodc6.CursorLocation = adUseClient
Adodc6.Open "select * from chek", db1, adOpenDynamic, adLockOptimistic


Adodc7.CursorLocation = adUseClient
Adodc7.Open "select * from email", db1, adOpenDynamic, adLockOptimistic


در تمامی فرم ها متغی ها به این صورت تعریف میشن

تعریف متغیر بانک :
Public db1 As New Connection

تعریف متغیر اشاره گر بانک که جدول ها رو میخونه
Dim Adodc1 As New Recordset
که برای هر حدول یک متغیر تعریف میشه و نام adodc1 به adodc2 و ... تبدیل میشه

چیز دیگه ای میمونه ؟:متفکر:

alizanganeh
چهارشنبه 08 آذر 1391, 21:44 عصر
محسن داداش کافیه اینا؟
شرمنده مزاحمت میشماااا

محسن واژدی
چهارشنبه 08 آذر 1391, 21:54 عصر
سلام علیکم
پوزش میخوام، متاسفانه به sql-server دسترسی ندارم نمیتونم درست بررسی کنم، برای تست اشاره گرهای Adodcرو هم قبل از بستن اتصال ها ببندین (هرچند که امید ندارم تاثیر خاصی داشته باشه)

alizanganeh
چهارشنبه 08 آذر 1391, 22:25 عصر
ممنون محسن جان
داداش قبلا زدم
تاثیری نداره
:افسرده:

عجب بنبستی شده هاااا :عصبانی++: