PDA

View Full Version : آیا بهتره که کانکشن SQL طی اجرای برنامه باز باشه یا فقط موقع نیاز باز باشه ؟



tehran11
دوشنبه 14 فروردین 1391, 09:45 صبح
با سلام و خسته نباشد

من تو یه برنامه با دیتابیس SQL نیاز به ارتباط زیادی با برنامه دارم. خوب البته مثل همه برنامه های دیتابیس !!!

حالا سوالم اینه که ایا بهتره فقط موقع نیاز با دیتابیس ارتباط داشته باشم (حالت اول)
به این شکل که کانکشن ساخته بشه (مقدار دهی بشه - باز بشه - کار مورد نظر انجام شه - بسته شه - حافظه آزاد شه - البته هر بار به این شکل)، یا اینکه یه کانکشن باشه و مقدار دهی شده باشه و فقط موقع نیاز باهاش کار بشه (حالت دوم) (باز بشه - کار مورد نظر انجام شه - بسته شه)

-- البته از نظر زمانی زیر چند دهم یا صدم ثانیه اختلاف مهم نیست.
-- برنامه نیازی نداره که همش دیتابیس باز باشه - چون اطلاعات تو دیتاستها یا دیتا تیبل ها بصورت کش شده هست.
-- زمان باز بودن برنامه هم زیاده مثلا هر روز صبح تا شب (ساعات کاری) (منظورم اینه که موقتی یا فقط روزی چند ساعت باهاش کار نمیشه)


ممنون از زمانی که میذارین.

Hybrid
دوشنبه 14 فروردین 1391, 10:12 صبح
سلام ، اصلش اینه که شما واسه یک پروژه از یک کانکشن استفاده کنید نه اینکه واسه هر عملی که روی بانک انجام بدین یک کانکشن رو ایجاد کنید.


-- برنامه نیازی نداره که همش دیتابیس باز باشه - چون اطلاعات تو دیتاستها یا دیتا تیبل ها بصورت کش شده هست.

این حرفتون درسته که باید در زمانی که به کار با دیتابیس اصلی نیاز هست کانکشن باز بشه ، کاره مورد نظر انجام بشه و سپس بسته شه ، و زمان این کار اصلا محسوس نیست ،

شما اطلاعات رو داخل حافظه ی اصلی یا همون رم ( داخل datatable ها و dataset ) میریزین و با اونا سروکار دارین مگر زمانی که بخواین اطلاعات رو داخل دیتابیس اصلی اعمال کنید.




-- زمان باز بودن برنامه هم زیاده مثلا هر روز صبح تا شب (ساعات کاری) (منظورم اینه که موقتی یا فقط روزی چند ساعت باهاش کار نمیشه)

این مهم نیست.

tehran11
دوشنبه 14 فروردین 1391, 10:15 صبح
یه مثال برا حالت اول :

public bool ExecDBNonQueryCommand(string DBCommand, string[] s)
{
SqlConnection scon;
SqlCommand scom;
bool return_value = false;

scon = new SqlConnection(con_str());
scom = new SqlCommand(DBCommand, scon);
scom.CommandType = CommandType.StoredProcedure;
// Send Parameters
try
{
scon.Open();
int i = scom.ExecuteNonQuery();
if (i == 1)
{
return_value = true;
}
else
{
return_value = false;
}
}
catch (Exception e)
{
// Display error message
}
finally
{
scon.Close();
scom.Dispose();
scon.Dispose();
}
return return_value;
}

یه مثالم برا حالت دوم :

public bool ExecDBNonQueryCommand(string DBCommand, string[] s)
{
bool return_value = false;

scon.Connection = con_str(); // متغیر قبلا بصورت سراسری ایجاد شده
scom.Connection = con_str(); // متغیر قبلا بصورت سراسری ایجاد شده
scom.CommandText = DBCommand;
scom.CommandType = CommandType.StoredProcedure;
// Send Parameters
try
{
scon.Open();
int i = scom.ExecuteNonQuery();
if (i == 1)
{
return_value = true;
}
else
{
return_value = false;
}
}
catch (Exception e)
{
// Display error message
}
finally
{
scon.Close();
}
return return_value;
}

Hybrid
دوشنبه 14 فروردین 1391, 10:27 صبح
100 درصد حالت دوم بهتر هست ،

شما باید واسه هر پروژه ای که میسازین یک کانکشن رو تعریف کنین و در جاهای مختلف ازش استفاده کنید ، مثل همون کد دومیتون ، فقط حواستون باشه ، هر وقت کانکشن رو بزا میکنید حتما ببندیدش تا در جاهای مختلف با خطا روبه رو نشین.

tehran11
دوشنبه 14 فروردین 1391, 10:33 صبح
vbBoss عزیز، ممنون از جوابهای خیلی سریعت.

اگه اینجوریه تو این پروژم با یه مشکل مواجه میشم، و اونم اینه که من تو چند تا فرم مختلف با دیتا بیس کار میکنم. یکی برا ایجاد یه مورد جدید. یکی برا اصلاح. یکی برای انتخواب و حذف.
حالا اون کانکشن اصلیه رو کجا بسازم که از تو کلاس اون چند تا فرم بتونم صداش کنم ؟؟؟

Hybrid
دوشنبه 14 فروردین 1391, 10:50 صبح
من خودم بیشتر موارد از پروژه ها رو به سبک ORM یا linq to sql میسازم و کانکشن استرینگ رو داخل Setting برنامه ذخیره میکنم ،


آموزش: آموزش Settings (http://barnamenevis.org/showthread.php?331456-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Settings-%28%D8%AD%D8%AA%D9%85%D8%A7-%D8%A8%D8%AE%D9%88%D9%86%DB%8C%D8%AF%29)


شما با چه تکنولوژی برنامتون رو مینویسین؟

tehran11
دوشنبه 14 فروردین 1391, 11:25 صبح
راستش شاید در حدی نباشم که حرف از سبک و روش بزنم، ولی من بیشتر ترجیح میدم که همه چیز رو تو کد برنامه داشته باشم حتی تا اونجایی که بتونم کامپوننت ها رو هم رانتایم میسازم.
در مورد تنظیمات هم یا تو فایل ini یا xml میذارمشون، کنار فایل اجرایی برنامه. اینجوری موقع اپدیت یا توضیح چیزی به کاربر یا تغییر و اصلاح اون توسط کاربر راحت تره.
چون نظرم اینه که اینجوری کنترلم بیشتره البته نمیدونم که درسته یا نه ؟ !!!!!!

p.yazdkhasti
دوشنبه 14 فروردین 1391, 11:56 صبح
سلام
پیشنهاد من این است که وارد جزییات این بخش نشوید و در نرم افزار های خود از یک ORM مانند Entity Framwork به منظور ارتباط با پایگاه داده استفاده نمایید. ولی پاسخ به سوال شما این است که به منظور ساخت Object های مورد نیاز در نرم افزار ها معمولا از یک کتابخانه Dependency Injection استفاده می شود و بنابراین روش بهینه برای ساخت Connection خود در نرم افزار استفاده از این کتابخانه ها یا استفاده از یک Factory است. در Entity Framework به منظور ساخت Connection ها از یک Factory استفاده می شود. شما می توانید از کلاس System.Data.SqlClient.SqlClientFactory در نرم افزار خود استفاده نمایید.
شما باید با هر بار استفاده از Connection آن را حتما ببندید. علاوه بر این نگران ساخته شدن Connection های جدید نباشید زیرا با ثابت بودن Connection String به صورت پیش فرض ADO.Net به منظور ارتباط با پایکاه داده از Connection pooling استفاده می کند.
به منظور اطلاعات بیشتر می توانید به لینک های زیر مراجعه کنید:
http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlclientfactory.aspx

tehran11
یک شنبه 20 فروردین 1391, 09:13 صبح
با سلام خدمت همه دوستان

من مشکلمو با این روش حل کردم:


اول یه کلاس درست کردم و کانکشن رو توش تعریف کردم، به نام DataFunctions :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace MyApp
{
public class DataFunctions
{
SqlConnection scon;

public bool ConfigConnection()
{
string con_str = @"Data Source=.\SQLEXPRESS;" +
@"AttachDbFilename = " + Application.StartupPath +
@"\DataBase.mdf;" +
@"Integrated Security=True;" +
@"Connect Timeout=30;" +
@"User Instance=True";

scon = new SqlConnection(con_str);
try
{
open_connection();
close_connection();
return true;
}
catch (Exception e)
{
// show error message
}
}

public void open_connection()
{
if (scon.State != ConnectionState.Open )
{
scon.Open();
}
}

public void close_connection()
{
if (scon.State != ConnectionState.Closed)
{
scon.Close();
}
}
}
}



بعدش تو فرم اصلی تعریفش کردم، البته استاتیک :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MyApp
{
public partial class frmMain : Form
{
public static DataFunctions df = new DataFunctions();

public frmMain()
{
}

private void Form1_Load(object sender, EventArgs e)
{
if (!df.ConfigConnection())
{
// show message
// close application
}
}
}
}


حالا تو فرمای دیگه فقط open میکنم و بعد از استفاده close، اینجوری :

frmMain.df.open_connection()

اینجوری هم یه بار کانکشن تعریف کردم، هم همه جا در دسترسه

hakim22
یک شنبه 20 فروردین 1391, 10:50 صبح
اگر از ADO.NET استفاده می کنید نیاز نیست به این مسئله فکر کنید چون اصولا ADO.NET هیچوقت برای همیشه به پایگاه وصل نیست و اینکارو خودکار انجام میده . شما connect شو و بقیشو بسپار به خودش !

بعد از اینکه شما به پایگاه وصل شدید ADO.NET از دادهها به صورت XML کپی میگیره و connection رو تا زمانی باز نگاه میداره که کار کپی یا بروز رسانی تموم بشه.
هر وقت شما AcceptChanges یا Update میکنی ADO.NET خودش به پایگاه به صورت مجدد وصل میشه و بروز رسانی رو انجام میده و دوباره قطع میشه. اون open مثل Open کردن فایل نیست. بیشتر به این معنی که شما اجازه دسترسی به پایگاه رو دارید و همچنین از server میخواد که در حالی که شما دارید با پایگاه کار می کنید اجازه پاک شدن فایلهای اصلی پایگاه رو نده و همچنین مدیریت چند کاربر که همزمان قراره با پایگاه کار کنند رو به عهده میگیره. ولی به این معنی نیست که همیشه همه ی اطلاعات توی پایگاه بعد از اتصال شما به برنامه ی شما مستقیما وصل باشه.

tehran11
یک شنبه 20 فروردین 1391, 11:27 صبح
دوست عزیز منظورم تو این پروژه C# هستش.