PDA

View Full Version : بستن تمام کانکشنها به بانک اطلاعاتی



Mrs.Net
چهارشنبه 03 مهر 1387, 10:19 صبح
آیا دستوری وجودداره که از داخل برنامه تمام کانکشنهایی که به بانک اکسس متصل هستند قطع بشن؟
سیستم درست بک آپ نمیگیره و فکر کنم دلیلش باز بودن بانک باشه.

BraveMind
چهارشنبه 03 مهر 1387, 13:28 عصر
اگه کار با بانک اصولی نباشه این اتفاق می افته بهت ژیشنهاد میکنم که یه نگاه به مدت بندازی چون هیچ وقت نباید بانکت برای مدت طولانی باز باشه یعنی همیشه بلافاصله بعد از open باید close بکنی
برا بک آپ بهتره یه کاری بکنی که تمام پنجره ها بسته بشن بعد پنجره بک آپ باز بشه ولی در مورد دستور توی اکسس نمیدونم ولی توی sql یه sp بنام kill وجود داره

razavi_university
چهارشنبه 03 مهر 1387, 14:49 عصر
پیشنهاد می کنم یک کار دیگه انجام بدین:
یک کلاس برای کل اعمالی که روی یک دیتابیس انجام میدهید تعریف کنین(نمونه این کلاسها در تاپیک نمونه برنامه ها هست)
بعد الگوی سینگلتونی رو روی این کلاس اعمال کنید (در واقع به این صورت که فراخوانی برای این کلاس چک می کند نمونه از این کلاس وجود دارد یا نه اگر وجود نداشت یک نمونه از کلاس ایجاد می کند و اگر وجود داشت نمونه موجود را به فراخواننده می فرستد )
در این حالت شما همواره حداکثر یک Connection باز خواهید داشت

BraveMind
چهارشنبه 03 مهر 1387, 14:55 عصر
این راه واقعا عالیه همون چیزی هست که من میگم فقط الگوی سینگلتونی یعنی چی این برام جدید بود اگه امکان داره وقتی جواب دادی با پیغام شخصی منم خبردار کنید

RED-C0DE
چهارشنبه 03 مهر 1387, 15:14 عصر
مثلا می تونین از یه همچین کلاسی برای کار با Connection های OleDb تون استفاده کنین تا فقط از یک مجرا به بانکتون وصل بشین و کنترلش هم راحت تر باشه :



public class clsSingletonConnectionManager
{
private static OleDbConnection _conOleDbLocal;

public static OleDbConnection GetConnection
{
get
{
return (_conOleDbLocal == null)
? (_conOleDbLocal = new OleDbConnection("[YOUR CONNECTION STRING]"))
: _conOleDbLocal;
}
}

public static bool Open_Connection()
{
OleDbConnection conTmp = GetConnection;

try
{
if (conTmp.State == System.Data.ConnectionState.Closed)
conTmp.Open();

return (conTmp.State == System.Data.ConnectionState.Open);
}
catch (Exception ex)
{
//handle the exception
return false;
}
}

public static void Close_Connection()
{
GetConnection.Close();
}

}

-----
این هم لینک 1001 نکته برای الگوی singleton :
http://barnamenevis.org/forum/showpost.php?p=486541

Mrs.Net
پنج شنبه 04 مهر 1387, 08:30 صبح
ممنون از راهنماییهاتون
حالا دستوری وجود داره که تمام کانکشنهارو ببنده؟

razavi_university
پنج شنبه 04 مهر 1387, 10:39 صبح
چون SQLConnectionها در فرمهای مختلف برنامه ایجاد شده اند پیداکردنشون یکم آسون نیست
فکر کنم اینطوری بشه


foreach (Form frm in Application.OpenForms)
{
foreach (Control ctrl in frm.Controls)
{
if ( Type.Equals(ctrl.GetType(),Type.GetType("SqlConnection")))
{
SqlConnection sqlConn = (SqlConnection)ctrl;
sqlConn.Close();
MessageBox.Show(sqlConn.ToString() + "Closed");
}
}
}


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

using (SqlConnection conn = new SqlConnection())
{
// my sql code here
}

استفاده کنین
البته میتونین از طرف Server هم اقدام به اینکار بکنین (اکثر اوقات برای Restore کاربرد داره) یعنی دیتابیس رو به حالت تک کاربره ببرین در این حالت همه Connection ها اضافی قطع میشند


ALTER DATABASE <db name> SET SINGLE_USER WITH ROLLBACK IMMEDIATE

و یا SP زیر


CREATE PROC sp_dboption2
(
@dbname sysname = NULL, --Database name
@optname varchar(35) = NULL, --Option name
@optvalue varchar(5) = NULL, --Option value, either 'true' or 'false'
@wait int = NULL --Seconds to wait, before killing the existing
connections
)
AS
BEGIN

DECLARE @dbid int, @spid int, @execstr varchar(15), @waittime varchar(15),
@final_chk int

--Only the following options require that, no other connections should
access the database
IF (LOWER(@optname) IN ('offline', 'read only', 'single user')) AND
(LOWER(@optvalue) IN('true', 'false'))
BEGIN
--Determining whether to wait, before killing the existing connections
IF @wait > 0
BEGIN
SET @waittime = (SELECT CONVERT(varchar, DATEADD(s, @wait, GETDATE()),
14))
WAITFOR TIME @waittime --Wait the specified number of seconds
END

SET @dbid = DB_ID(@dbname) --Getting the database_id for the specified
database

--Get the lowest spid
TryAgain:
SET @spid = (SELECT MIN(spid) FROM master..sysprocesses WHERE dbid =
@dbid)

WHILE @spid IS NOT NULL
BEGIN
IF @spid <> @@SPID --To avoid the KILL attempt on own connection
BEGIN
SET @execstr = 'KILL ' + LTRIM(STR(@spid))
EXEC(@execstr) --Killing the connection
END
--Get the spid higher than the last spid
SET @spid = (SELECT MIN(spid) FROM master..sysprocesses WHERE dbid =
@dbid AND spid > @spid)
END

END

SET @final_chk = (SELECT COUNT(spid) FROM master..sysprocesses WHERE dbid =
@dbid)
IF (@final_chk = 0) OR (@final_chk = 1 AND DB_NAME() = @dbname)
BEGIN
EXEC sp_dboption @dbname, @optname, @optvalue --Calling sp_dboption to
complete the job
END
ELSE
BEGIN
GOTO TryAgain --New connections popped up, or killed connections aren't
cleaned up yet, so try killing them again
END
END