PDA

View Full Version : گفتگو: خروجی گرفتن از DatagridView روی فایل اکسس



ozzy_mra
چهارشنبه 30 دی 1388, 12:53 عصر
دوستان عزیز سلام
من چند روزی دنبال این بودم که بتونم اطلاعات توی یه دیتا ست(مثلاً اطلاعات یک دیتا گرید) رو تو فایل اکسس نمایش بدم
بلاخره با کمک اساتید همین سایت و دوستان یه راه حلی برای این کار پیدا کردم گفتم که هم به اشتراکش بزارم که دوستان کدها رو ببینن و هم اساتید اگه روش بهتری مد نظرشون هست
منو راهنمایی کنن
البته ذکر این نکته ضروریه که دیتا گرید اطلاعات رو از دیتابیس Sql Server می خونه
برای این کار ابتدا فایل اکسس رو با مشخصات دیتاست به کمک کلاس زیر می سازیم :

namespace Test
{
public class DatasetToJet
{

static public void CopyDatasetSchemaToJetDB(DataSet ds, string jetFileName)
{
string connstr = string.Format(@"Data Source=""{0}"";Jet OLEDB:Engine Type=5;"+
@"Provider=""Microsoft.Jet.OLEDB.4.0"";User ID=Admin;", jetFileName);
Catalog cat = new CatalogClass();
if (!System.IO.File.Exists(jetFileName))
cat.Create(connstr);
else
{
ADODB.Connection conn = new ConnectionClass();
conn.Open(connstr, "Admin", "",-1);
cat.ActiveConnection = conn;
}

foreach (DataTable table in ds.Tables)
{
try
{
cat.Tables.Delete(table.TableName);
}
catch { }
ADOX.Table adoxTab = CopyDataTable(table, cat);
cat.Tables.Append(adoxTab);
}
}
static private ADOX.Table CopyDataTable(DataTable table, Catalog cat)
{
ADOX.Table adoxTable = new ADOX.TableClass();
adoxTable.Name = table.TableName;
// نام جدول در اکسس
string str = Convert.ToString(adoxTable.Name);

//
adoxTable.ParentCatalog = cat;
foreach(System.Data.DataColumn col in table.Columns)
{
ADOX.Column adoxCol = new ADOX.ColumnClass();
adoxCol.ParentCatalog = cat;
adoxCol.Name = col.ColumnName;
adoxCol.Type = TranslateDataTypeToADOXDataType(col.DataType);
if (col.MaxLength >=0 )
adoxCol.DefinedSize = col.MaxLength;
adoxTable.Columns.Append(adoxCol, adoxCol.Type, adoxCol.DefinedSize);
}
return adoxTable;
}

static private ADOX.DataTypeEnum TranslateDataTypeToADOXDataType(Type type)
{
string guid = type.GUID.ToString();
ADOX.DataTypeEnum adoxType =
guid == typeof(bool).GUID.ToString() ? ADOX.DataTypeEnum.adBoolean :
guid == typeof(byte).GUID.ToString() ? ADOX.DataTypeEnum.adUnsignedTinyInt:
guid == typeof(char).GUID.ToString() ? ADOX.DataTypeEnum.adChar :
guid == typeof(DateTime).GUID.ToString() ? ADOX.DataTypeEnum.adDate :
guid == typeof(decimal).GUID.ToString() ? ADOX.DataTypeEnum.adDouble :
guid == typeof(double).GUID.ToString() ? ADOX.DataTypeEnum.adDouble :
guid == typeof(Int16).GUID.ToString() ? ADOX.DataTypeEnum.adSmallInt :
guid == typeof(Int32).GUID.ToString() ? ADOX.DataTypeEnum.adInteger :
guid == typeof(Int64).GUID.ToString() ? ADOX.DataTypeEnum.adBigInt :
guid == typeof(SByte).GUID.ToString() ? ADOX.DataTypeEnum.adTinyInt :
guid == typeof(Single).GUID.ToString() ? ADOX.DataTypeEnum.adSingle :
guid == typeof(string).GUID.ToString() ? ADOX.DataTypeEnum.adLongVarWChar :
guid == typeof(TimeSpan).GUID.ToString() ? ADOX.DataTypeEnum.adDouble :
guid == typeof(UInt16).GUID.ToString() ? ADOX.DataTypeEnum.adUnsignedSmallInt :
guid == typeof(UInt32).GUID.ToString() ? ADOX.DataTypeEnum.adUnsignedInt :
guid == typeof(UInt64).GUID.ToString() ? ADOX.DataTypeEnum.adUnsignedBigInt :
ADOX.DataTypeEnum.adBinary;
return adoxType;
}


}
}

فقط در بالای کلاس باید کد زیر رو هم اضافه کنیم

using ADOX;
using ADODB;
using System.Data.OleDb;
using System.Data;
که با اضافه کردن Refrence های ADOX.dll & adodb میشه ازشون استفاده کرد


بعد در رویداد کلیک دکمه روی صفحه ابتدا کلاس رو با پاس دادن مقدار دیتا ست و نام و مسیر فایل فراخوانی می کنیم
من در اینجا با کمک InputBox
نام فایلو از کاربر می گیرم
و بعد از هموم کوئری که برای پر کردن دیتا ست استفاده کرده بودم فایل اکسس رو پر می کنم
تو این مثال من باید یه پارامتر هم به کوئریم پاس بدم که مقدارش تو تکست باکسه

//************************************************** ****************************
try
{
DatasetToJet obj1 = new DatasetToJet();
string fileName;
/* برای استفاده از
* inputbox
* در c# باید refrence
* Microsoft Visual Basic .Net Runtime رو به reference ها اضافه کنید
* */
////////string driveName = Microsoft.VisualBasic.Interaction.InputBox("فقط نام درایو مورد نظر برای ذخیره اطلاعات را وارد کنید", string.Empty, string.Empty, 0, 0);
////////fileName = Microsoft.VisualBasic.Interaction.InputBox("فقط نام فایل مورد نظر خود را وارد کنید", string.Empty, string.Empty, 0, 0);
//////////fileName = saveFileDialog1.FileName;
////////fileName = driveName + ":\\" + fileName + ".mdb";
SaveFileDialog svDlg = new SaveFileDialog();
svDlg.Filter = "(*.mdb) Access Files|*.mdb";
svDlg.Title = "مسیر فایل اکسس را جهت گرفتن خروجی مشخص نمائید";
if (svDlg.ShowDialog() == DialogResult.OK)
{
fileName = svDlg.FileName;
string tblName = Text1.Tables[0].TableName;
Sql_To_Access.DatasetToJet.CopyDatasetSchemaToJetD B(Text1, fileName);
string commandString = "INSERT into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + fileName + "';'admin';''," + tblName + ") " + command;
SqlConnection objconn = new SqlConnection("server=192.168.1.39;initial catalog=Northwind;uid=sa;pwd=1");
objconn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = objconn;
cmd.CommandText = commandString;
cmd.ExecuteNonQuery();
MessageBox.Show("done");
objconn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
فقط برای اینکه از کوئری بالا بتونیم استفاده کنیم در sql server و در enterprise Manager
روی نام سرور کلیک راست می کنیم و گزینه Facets رو انتخاب می کنیم و بعد در بخش facet گزینه Surface Area Configuration رو انتخاب و مقدار
AddHocRemoteQueriesEnable رو true می کنیم
اساتید عزیز اگر ممکنه در این خصوص نظر خودشونو بدن و اگه راه بهتری سراغ دارند منو هم راهنمایی کنند

ozzy_mra
چهارشنبه 30 دی 1388, 13:08 عصر
توضیح : Text1 نام دیتا سته :لبخند::لبخند::لبخند::خجالت:

HAMRAHSOFT.IR
دوشنبه 22 آذر 1389, 20:23 عصر
ممكن بصورت يك فايل بزار يكي اين كدهارو و از اين روش براس ساخت تيبل در فايل اكسس كه مجود هست نيز ميشه استفاده كرد

ozzy_mra
سه شنبه 23 آذر 1389, 12:11 عصر
سلام
اینم سورس برنامه

فقط دو باره تأکید می کنم که برای اینکه عمل اکسپورت تو این مثال جواب بده حتماً باید :
در sql server و در enterprise Manager
روی نام سرور کلیک راست می کنیم و گزینه Facets رو انتخاب می کنیم و بعد در بخش facet گزینه Surface Area Configuration رو انتخاب و مقدار
AddHocRemoteQueriesEnable رو true می کنیم

ozzy_mra
سه شنبه 23 آذر 1389, 12:21 عصر
ممكن بصورت يك فايل بزار يكي اين كدهارو و از اين روش براس ساخت تيبل در فايل اكسس كه مجود هست نيز ميشه استفاده كرد
سلام
خیلی از جملتون چیزی دستگیرم نشد ولی اگه سورسشو خواسته باشد که گذاشتم در مورد سوال دومتون اگه منظورتون رو درست متوجه شده باشم! در مورد کپی کردن اطلاعات در تیبلی که وجود داره
راستش امتحان نکردم ولی فکر کنم باید دو تا کار انجام بدی :
1- مسیر فایل اکسس جدیدتو به جای fileName در
string commandString = "INSERT into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + fileName + "';'admin';''," + tblName + ") " + command; پاس بدی
2- نام تیبلت رو هم به جای tblName پاس بدی که البته tblName نام تیبلیه که در فایل اکسست وجود داره
ضمناً باید ساختار تیبل جدیدتم همخونی داشته باشه با سلکتی که انجام میدی !!
اما برای اضافه کردن تیبل جدید به یه فایل اکسس موجود دیگه نیازی به تنظیم خاصی نیست و فقط باید مسیر فایل و نام تیبل جدید رو پاس بدی

HAMRAHSOFT.IR
سه شنبه 23 آذر 1389, 12:32 عصر
سلام
خیلی از جملتون چیزی دستگیرم نشد ولی اگه سورسشو خواسته باشد که گذاشتم در مورد سوال دومتون اگه منظورتون رو درست متوجه شده باشم! در مورد کپی کردن اطلاعات در تیبلی که وجود داره
راستش امتحان نکردم ولی فکر کنم باید دو تا کار انجام بدی :
1- مسیر فایل اکسس جدیدتو به جای fileName در
string commandString = "INSERT into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + fileName + "';'admin';''," + tblName + ") " + command; پاس بدی
2- نام تیبلت رو هم به جای tblName پاس بدی که البته tblName نام تیبلیه که در فایل اکسست وجود داره
ضمناً باید ساختار تیبل جدیدتم همخونی داشته باشه با سلکتی که انجام میدی !!
اما برای اضافه کردن تیبل جدید به یه فایل اکسس موجود دیگه نیازی به تنظیم خاصی نیست و فقط باید مسیر فایل و نام تیبل جدید رو پاس بدی

يعني با كد كه شما گفتيد متونم تما اطلاعات ديتا گريد رو داخل يك تبيل كه فيلد هاش با گريد يكي هست بصورت يكجا انطقال بدم؟
ديتا بيس اكسس مي باشد

ozzy_mra
سه شنبه 23 آذر 1389, 12:55 عصر
بله ، الان امتحان کردم ، اگه tblname رو برابر نام تیبلی که در دیتا بیست هست قرار بدی، اطلاعات رو میره تو همون تیبل میریزه و لی کل اطلاعات قبلی رو هم پاک می کنه و اطلاعاتی که در گرید ویو نمایش دادی رو جایگزین اونا می کنه، البته نیازی به تغییر ساختار نیست فقط باید مسیر فایل و نام تیبل رو بهش پاس بدی
ولی اگه فقط بخوای اطلاعات درون گرید ویوت به عنوان یه جدول جدید در دیتابیست نمایش داده بشه، Filename رو برابر مسیر فایل اکسست و tblName رو معادل نام تیبل دلخواه خودت تو دیتا بیست قرار میدی
فقط یه با دیگه تاکید می کنم که اگر اطلاعاتت روی تیبلی که از قبل وجود داشته باشه بریزه اطلاعات قبلیت پاک میشه!

HAMRAHSOFT.IR
سه شنبه 23 آذر 1389, 13:21 عصر
شرمنده من من كد فوق نوشتم ولي هيچ كاري نمي كنه
البته به دين صورت

string commandString = "INSERT into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + "D:\\Excel\\ExcelToDataGridView\\bin\\Debug\\ali.ac cdb" + "';'admin';''," + "ImportTemp" + ") " + dataGridView1.DataSource;

وازاين روش هم براي خواندن اطلاعات فايل اكسل استفاده مكنم كه داخل هميت سايت پيدا كردم

ozzy_mra
سه شنبه 23 آذر 1389, 14:29 عصر
شرمنده من من كد فوق نوشتم ولي هيچ كاري نمي كنه
البته به دين صورت

string commandString = "INSERT into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + "D:\\Excel\\ExcelToDataGridView\\bin\\Debug\\ali.ac cdb" + "';'admin';''," + "ImportTemp" + ") " + dataGridView1.DataSource;

وازاين روش هم براي خواندن اطلاعات فايل اكسل استفاده مكنم كه داخل هميت سايت پيدا كردم

دوست عزیز شما داری از Excell می خونی و به خاطر همین دستور openrowset رو پشتیبانی نمی کنه.
من خودم بلد نیستم که چطور این کار رو میشه انجام داد ولی اگه بتونی کوئری که فایل اکسل رو به فایل اکسس Import میکنه رو پیدا کنی و اونو جای CommandString قرار بدی فکر می کنم تو این مورد جواب میده

HAMRAHSOFT.IR
شنبه 27 آذر 1389, 09:07 صبح
امكان داره بعد از نمايش اطلاعات داخل گريد يك تيبل برحسب گريد ايجاد شود و بعد اطلاعات ذخيره شود؟

HAMRAHSOFT.IR
دوشنبه 29 آذر 1389, 10:05 صبح
دوستان امكان داره ديتا تيبلي كه توسط اون گيريد پر ميشه را به تيبل اكسس انتقال داد؟