PDA

View Full Version : آموزش: واکشی اطلاعات از فایل اکسل 2007 و قرار دادن در DataGridView



Hkarimi
چهارشنبه 26 تیر 1392, 13:13 عصر
سلام.

از عنوان تاپیک مشخصه که جریان چیه. بدون مقدمه بریم سراغ کدها...


OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName + " ;Extended Properties=\"Excel 12.0;HDR=YES;\"";

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

// sheet1 که دیگه مشخصه که چیه. اسم شیت توی فایل اکسله. فقط دقت کنید که حتما علامت دلار باید آخرش قرار بگیره
string strSQL = "SELECT * FROM [Sheet1$]";

دیگه بقیش مث کار با بانکه. خب اینم یه نوع بانکه دیگه
OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();

OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

System.Data.DataTable dTable = new System.Data.DataTable();
dataAdapter.Fill(dTable);

DataGridView1.DataSource = dTable;

dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();

اگه مفید بود خودتون میدونید باید چکار کنید...

hojjatshariffam
چهارشنبه 26 تیر 1392, 14:22 عصر
حالا یه سئوال
آیا لزومی به دیسپوز کردن بعضی آبجت ها که شما انجامش دادین هست یا نه
چون اینها مگر متغییر های محلی نیستن ؟ متغییر محلی با اتمام محدودش (مثلا متد) خودش مگر دیسپوز نمی شود؟

dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();

M_Tavakoli_70
چهارشنبه 26 تیر 1392, 14:31 عصر
اره خودش dispose میشه ولی اگر بزاری بهتره.

Hkarimi
چهارشنبه 26 تیر 1392, 15:45 عصر
نه نه اشتباه نکنید. اگه قرار بود خودش Dispose شه و منابع اشغال شدش آزاد شه پس به نظرتون چرا این متد رو گذاشتن؟ این بحثش شدیدا مفصله و به همون مقدار جالب. این بحثا مربوط به مدیریت حافظه توسط Garbage Collector میشن که یه توضیح کوچیک (مثل قطره نسبت به دریا) دربارش میدم.

ببینید کلا منابع تو دات نت به دو دسته مدیریت شده و مدیریت نشده تقسیم میشن. این مدیریت شده ها همونایی هستن که توسط خود سیستم مدیریت میشن، حافظشون آزاد میشه و هر بلایی که لازم باشه خود سیستم به سرشون میاره. و اما این مدیریت نشده ها که خدا بگم چی به سرشون بیاد، باید "تا حدی" توسط خود برنامه نویس مدیریت شن. (ببین مایکروسافت یه کارو گذاشت به عهده خودمونا... ببین چه بل بشویی راه افتاده سر اینا!!!) اینا همونایی هستن که توسط کلمه new یه نمونه ازشون تعریف میشه. مثل Connectionها . شما وقتی از Connection استفاده میکنید اونو نمیبندید؟ کاملا روشنه که میبندید و یا چرا راه دور بریم چرا وقتی از فایلا استفاده میکنید میگن که حتما ارتباط با اون فایل رو قطع کنید؟ چرا باید خودتون مدیریت کنید؟ اینجا باید برید و GC رو بشناسید.

به جای تکرار مکررات بهتره یه سر به لینک زیر بزنید چون خیییلی قشنگ تو بعضی از پستا بهش اشاره شده. فقط قبلش بگم که توی تمام مراجع معتبر گفته شده که وقتی از کلاسی استفاده کردید که متد Dispose داره حتما این متد رو صدا بزنید.

http://barnamenevis.org/showthread.php?142152-Dispose-%D9%88-%D9%84%D8%B2%D9%88%D9%85-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86

hojjatshariffam
چهارشنبه 26 تیر 1392, 19:14 عصر
خب پس یه سئوال جالبتر
من روش اتصال به پایگاه دادم اینطوریه

من یه کلاس دیتا اکسس دارم که توش اینارو تغریف کردم

private static String Server = "Server";
private static String DataBase = "DBName";
private static String User = "DBAdmin";
private static String Pass = "1234";
private static ServerType Server_Type;
private IDbConnection ObjConn;
یه بار در شروع برنامه متغییر های نام سرور و یوزر پسورد رو ست می کنم
بعد تو لایه منیجرم برای هر متد یه بار از این کلاس دیتا اکسسم نیو می کنم به این صورت

}public static DataTable SelectAll()
{
try
{
DataAccess Select = new DataAccess();
DataTable dt = new DataTable();
string SQLstr;
SQLstr = "Select * Frome [Group_tbl]");
dt = Select.FillTable(SQLstr);
return dt;
}
catch (Exception EX)
{
throw new Exception(EX.Message + "(واکشی داده)");
}

متغییر Select از این کلاسه
متد FillTable در کلاس دیتا اکسسم این طوریه
[global::System.Diagnostics.DebuggerNonUserCodeAttr ibute()]
public DataTable FillTable(string SelectStr)
{
DataSet dataSet = new DataSet();
DataTable Table = new DataTable();
IDbDataAdapter DataAddapt = GetDataAdapter();
DataAddapt.SelectCommand.Connection = ObjConn;
DataAddapt.SelectCommand.CommandText = SelectStr;
DataAddapt.SelectCommand.CommandType = CommandType.Text;

try
{
Boolean CFlag = false;
while (!CFlag)
{
CFlag = this.Connect();
}
DataAddapt.Fill(dataSet);
Table = dataSet.Tables[0];
}
catch (SqlException EX)
{
throw new Exception("خطایی در عملیات بازیابی داده ها بوجود آمده است " + "\n " + FDBErrorMessages.BuildErrorMessage(EX));
}
catch (SqlCeException EX)
{
throw new Exception("خطایی در عملیات بازیابی داده ها بوجود آمده است " + "\n " + FDBErrorMessages.BuildErrorMessage(EX));
}
catch (OleDbException EX)
{
throw new Exception("خطایی در عملیات بازیابی داده ها بوجود آمده است " + "\n " + FDBErrorMessages.BuildErrorMessage(EX));
}
catch (Exception EX)
{
throw new Exception(EX.Message + "\n" + "خطایی در عملیات بازیابی داده ها بوجود آمده است ");
}
finally
{
this.DisConnect();
}
}


اینم متذ GetDataAdapter

[global::System.Diagnostics.DebuggerNonUserCodeAttr ibute()]
private IDbDataAdapter GetDataAdapter()
{
IDbDataAdapter DataAddapt = null;
switch (Server_Type)
{
case ServerType.SQLServe_ServerBase:
DataAddapt = new SqlDataAdapter();
break;
case ServerType.SQLServer_FileBase:
DataAddapt = new SqlCeDataAdapter();
break;
case ServerType.Access_FileBase:
DataAddapt = new OleDbDataAdapter();
break;
}
DataAddapt.SelectCommand = GetCommand();
return DataAddapt;
}

حالا سئوالم اینه که من هیچ جا دیسپوری انجام ندادم
با توجه به این که متغییر هام از نوع استاتیک هستند ، آیا همشون روی هم جمع میشن و حافظمو اشغال می کنند؟
در ضمن من در لایه منیجرم متد هام هم به صورت استاتیک هستند ، یعنی هیچ وقت نیو نمی کنم
آیا اینم مشکل داره
به صورت زیر

DataTable DT = GroupManagment.SelectAll();

hojjatshariffam
پنج شنبه 27 تیر 1392, 15:37 عصر
کسی کدای منو بررسی نکرده ببینه آیا اینا مشکلی در بازپس گیری حافظه دارند یا نه
و یا کندی سیستم و مشکل ترید داند یا نه؟