ozzy_mra
چهارشنبه 30 دی 1388, 13: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 می کنیم
اساتید عزیز اگر ممکنه در این خصوص نظر خودشونو بدن و اگه راه بهتری سراغ دارند منو هم راهنمایی کنند
من چند روزی دنبال این بودم که بتونم اطلاعات توی یه دیتا ست(مثلاً اطلاعات یک دیتا گرید) رو تو فایل اکسس نمایش بدم
بلاخره با کمک اساتید همین سایت و دوستان یه راه حلی برای این کار پیدا کردم گفتم که هم به اشتراکش بزارم که دوستان کدها رو ببینن و هم اساتید اگه روش بهتری مد نظرشون هست
منو راهنمایی کنن
البته ذکر این نکته ضروریه که دیتا گرید اطلاعات رو از دیتابیس 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 می کنیم
اساتید عزیز اگر ممکنه در این خصوص نظر خودشونو بدن و اگه راه بهتری سراغ دارند منو هم راهنمایی کنند