PDA

View Full Version : سوال: اتصال به بانک sql با استفاده از کلاس ها



veniz2008
چهارشنبه 14 دی 1390, 19:29 عصر
سلام،من این ترم پروژه وب دارم و استادمون خواسته که برای اتصال به بانک از یک کلاس استفاده کنیم(یعنی از روش معمولی که کدهای اتصال رو داخل یک دکمه مینویسیم استفاده نکنیم)،ممنون میشم که کدهای مربوط به اتصال به بانک sql با استفاده از یک کلاس رو برام بذارید،اگه میشه توضیحاتی درباره کدها هم بفرمایید.

uniqueboy_ara
چهارشنبه 14 دی 1390, 20:01 عصر
من خودم از این کلاس استفاده می کنم که شامل 4تا تابع هست و همه کارایی که میخوام رو انجام میده
1. دستورات بدون خروجی ( SELECT )
2.دستورات خروجی دار ( INSERT, UPDATE, DELETE )
3.اجرای دستور SELECT با خروجی DataView برای استفاده مستقیم در دیتا گرید
4.اجرای دستور SELECT با خروجی DataSet برای استفاده مستقیم در CrystalReports


class DB_SQL
{
public static string Conection_S = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|DB_SELL_SYSTEM_Data.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";//bartebghe tanzimate SQL taghir mikonad

public void EXEC(string sql)
{

SqlConnection con = new SqlConnection();
con.ConnectionString = Conection_S;
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = sql;

con.Open();
com.ExecuteNonQuery();
con.Close();
}

public SqlDataReader select(string sql)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = Conection_S;
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = sql;
SqlDataReader dr;
con.Open();
dr = com.ExecuteReader(CommandBehavior.CloseConnection) ;
dr.Read();
return dr;
}

public DataView data_update_manual(string sql)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = Conection_S;

DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter = new SqlDataAdapter(sql,con);
adapter.Fill(ds);
con.Close();

DataView dv = new DataView(ds.Tables[0]);
return dv;
}

public DataSet select_r(string sql)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = Conection_S;

DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter = new SqlDataAdapter(sql, con);
adapter.Fill(ds);
con.Close();

return ds;
}

}

mohammad272005
چهارشنبه 14 دی 1390, 21:04 عصر
با تشکر از دوست عزیزم uniqueboy_ara،
معمولا برنامه های دیتابیسی، از کلاسهایی مثل کلاس طراحی شده توسط شما، زیاد استفاده میکنن. چند بهتره این کلاسها، کاملا optimum باشن.



پس چند تا پیشنهاد در همین راستا، در مورد کدهای فوق دارم که عرض میکنم.

این کلاس احتمالا بارها در طول اجرای برنامه instantiate میشه. واسه همین به هیچ عنوان نباید garbage ایجاد کنه. متاسفانه اکثر کلاسهای موجود در ADO.NET، تماما Disposable هستن. پس ترجیحا باید بعد از استفاده، Dispose بشن. برای مثال، من کد select رو به ترتیب زیر، تغییر میدم:
public DataSet FillDataSet(string sql)
{
DataSet result;
using (var con = new SqlConnection(Conection_S))
{
result = new DataSet();
using (var adapter = new SqlDataAdapter(sql, con))
adapter.Fill(result);
con.Close();
}
return result;
}



موارد مورد توجه:
کلاسهای SqlConnection، SqlDataAdatper و همچنین DataSet همگی Disposable هستن، ولی چ.ن مقدار بازگشتی متد، DataSet هست، caller، موظف به dispose اونه نه متد ما. ولی برای دو مورد دیگه، من این کار رو با قرار دادنشون در using، انجام دادم.
متغییر adapter، در هنگام تعریف، یک با مقداردهی میشه، در خط بعد بلافاصله مجددا مقدار میگیره، و مقدار قبلی خودش رو در حافظه باقی میذاره. (طبق عرایض بالا) چون Disposable هست، Garbage Collector هم از حافظه حذفش نمیکنه.
ctor کلاس SqlConnection، میتونه ConnectionString رو بگیره، نیازی به مقداردهی اون در خط مجزا نیست.


مورد بعدی، ConnectionString هست. در صورتیکه اون رو تبدیل به property کنید تا بشه کلاس رو در برنامه های دیگه هم بکار برد، بهتره. (ترجیحا در Ctor مقدار بگیره بهتره)
مورد آخر و کمی پیچیده تر اینکه بخاطر Connection Pooling، بهتره بجای ConnectionString، خود SqlConnection با ConnectionStringِ دریاقتی در ctor مقدار بگیره تا performance برنامه بالا بره. در این صورت، ترجیحا خود کلاس هم بهتره disposable باشه تا هنگام Dispose کلاس، Connection هم dispose بشه.
در آخر، کلاس فوق رو من به این صورت تغییر میدم. (البته با اجازه و احترام به صاحب اصلی):
public class DbSql : IDisposable
{
private readonly SqlConnection _Connection;
public DbSql(string connectionstring)
{
this._Connection = new SqlConnection(connectionstring);
}
#region IDisposable Members
public void Dispose()
{
if (this._Connection != null)
this._Connection.Dispose();
}
#endregion
public void Exec(string sql)
{
try
{
using (var com = new SqlCommand {Connection = this._Connection, CommandText = sql})
{
this._Connection.Open();
com.ExecuteNonQuery();
}
}
finally
{
this._Connection.Close();
}
}
public SqlDataReader SelectReader(string sql)
{
SqlDataReader dr;
using (var com = new SqlCommand {Connection = this._Connection, CommandText = sql})
{
this._Connection.Open();
dr = com.ExecuteReader(CommandBehavior.CloseConnection) ;
}
dr.Read();
return dr;
}
public DataView FillDataView(string sql)
{
try
{
DataView dv;
using (var ds = new DataSet())
{
var adapter = new SqlDataAdapter(sql, this._Connection);
adapter.Fill(ds);
dv = new DataView(ds.Tables[0]);
}
return dv;
}
finally
{
this._Connection.Close();
}
}
public DataSet FillDataSet(string sql)
{
try
{
var result = new DataSet();
var adapter = new SqlDataAdapter(sql, this._Connection);
adapter.Fill(result);
return result;
}
finally
{
this._Connection.Close();
}
}
}

veniz2008
پنج شنبه 15 دی 1390, 00:19 صبح
ببینید دوستان عزیز،من فقط میخوام از طریق کلاس به sql وصل بشم،قصد درج و حذف و ... رو با استفاده از کلاس ها ندارم،تو حالت معمولی از عبارت زیر استفاده میکنیم:

SqlConnection conn =
new SqlConnection("Data Source = (local);Initial Catalog=US_DB;Integrated Security=True");
حالا سوال من اینه:به جای کد بالا،اگه بخوایم با استفاده از کلاس وصل بشیم باید چی بنویسیم و چطوری بنویسیم،تا الان این مدلی کار نکردم واسه همین ممنون میشم کامل توضیح بدید،تشکر از محبتتون.

veniz2008
پنج شنبه 15 دی 1390, 10:52 صبح
دوستان عزیز لطفا راهنمایی کنید.

mohammad272005
پنج شنبه 15 دی 1390, 14:02 عصر
والله راستش اصلا سوالت رو نمیفهمم :گیج:

veniz2008
پنج شنبه 15 دی 1390, 18:39 عصر
مشکلی نیست،بیشتر توضیح میدم،ببینید استادمون گفته که یک کلاس بسازید و کدهای مربوط به اتصال به پایگاه داده sql را درون این کلاس بنویسید،اما برای درج و حذف و آپدیت و ... نیازی به استفاده از کلاس ها نیست،امیدوارم متوجه شده باشید.

ali reza mansoori 2
جمعه 16 دی 1390, 12:10 عصر
دوستان نحوه استفاده از این کلاس رو توضیح بدید
1. دستورات بدون خروجی ( SELECT )
2.دستورات خروجی دار ( INSERT, UPDATE, DELETE )
3.اجرای دستور SELECT با خروجی DataView برای استفاده مستقیم در دیتا گرید
4.اجرای دستور SELECT با خروجی DataSet برای استفاده مستقیم در CrystalReports
خیلی ممنون

mohammad272005
شنبه 17 دی 1390, 22:06 عصر
مثال:
const string connectionstring = @"...";
using (var db = new DbSql(connectionstring))
{
db.Exec("INSERT User (UserName, Password) VALUES (Admin, 1)");
const string selectFromUser = "SELECT * FROM User";
foreach (var user in db.SelectReader(selectFromUser))
{
}
using (var dataSet = db.FillDataSet(selectFromUser))
{
Console.WriteLine("======");
Console.WriteLine("{0,-20}\t{1}", "UserName", "Password");
foreach (var row in dataSet.Tables[0].Select())
Console.WriteLine("{0,-20}\t{1}", row["UserName"], row["Password"]);
}
db.Exec("DELETE FROM User");
}

البته من ابن کد رو بدون Visual Studio نوشتم. امیدوارم درست باشه