ASP.NET2.0如何实现MDF文件向MDB文件的转换 现在遇到一个非常棘手的问题就是:在ASP.NET2.0中 现在只有MDF文件 需要将它集合到代码中,但是呢?读取的时候必须是MDB文件,有人知道这个问题的解决方法不? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 实现的过程可分为三个主要步骤:创建MDB文件→在MDB文件中创建数据表(即创建表结构)→往数据表添加数据。在这三个主要步骤中均需要使用ADO.NET技术连接MDF文件,ASP.NET下利用C#连接MDF的关键代码可表示为: string mdfFileName = "Northwind"; string connstring="Data Source=.;initialcatalog="+mdfFileName+";integrated security=sspi;"); SqlConnection conn = new SqlConnection(connstring); conn.Open(); 其中mdfFileName表示待连接的MDF数据库(数据库名),实际应用时以上代码可封装成一个方法,将方法类型定义为sqlConnection,即方法返回值为sqlConnection类型,方法的形参为string类型,代表待连接的MDF数据库文件名。下面为方法的定义: //定义连接DBF数据库方法private sqlConnection OpenMdfDatabase(string databaseFileName){ string mdfFileName = databaseFileName; //此处为连接MDF数据库的具体代码 return conn;} 2.1创建MDB文件即创建Access数据库 .NET2.0框架下动态创建Access数据库需要在应用系统中添加引用“Microsoft ADD Ext.2.8 For DDL and Security”. 然后通过使用ADOX命名空间下CatalogClass类的Create方法实现,实现的关键代码为:ADOX.CatalogClass myCatalogClass = new ADOX.CatalogClass();myCatalogClass.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbFileName + ";"); 其中变量mdbFileName表示待创建的Access数据库文件名(含路径和扩展名)。 2.2 创建Access数据表 Access数据表与MDF数据库一样都是属于二维关系数据库,即以每个字段为一列、每行为一条记录的数据集合。 在Access数据库中动态创建数据表的过程实际上就是创建数据库的结构,根据表格 1所提供的它们二者字段类型的对应关系,通过ADO.NET技术首先连接MDF文件,再利用ADO.NET Framework数据提供程序的DataReader对象即可取得MDF文件各字段属性(字段名称、类型等)。 .NET2.0框架下动态创建Access数据表也需要在应用系统中添加引用“Microsoft ADD Ext.2.8 For DDL and Security”,然后使用ADOX命名空间下TableClass类中的相关方法和属性实现。实现的关键代码如下: //创建Access数据库文件 //mdbFileName表示待创建的Access数据库文件名(含绝对路径+文件名称+扩展名)。 string mdbFileName = @"c:\教务管理系统数据备份\" + txtAccName.Text.Trim() + ".mdb"; if (!mdbFileName.EndsWith(".mdb")) { mdbFileName += ".mdb"; } if (File.Exists(mdbFileName)) { Response.Write(" <script language=javascript>alert('此文件已存在,请重新输入!');location='xx1.aspx' </script>"); return; } ADOX.CatalogClass myCatalogClass = new ADOX.CatalogClass(); myCatalogClass.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbFileName + ";"); //创建Access数据表(条用以下方法) SqlBackUpToAccess.CreateAccessTable(conn, "select * from student", "student", myCatalogClass); 以下是创建Access数据表的方法封装: /// <summary> /// 创建Access数据表 /// </summary> /// <param name="conn">连接Sql Server数据库</param> /// <param name="sqlstring">Sql Server数据库的表查询语句 如:select * from student表</param> /// <param name="AccessTableName">要在Access中创建的表名</param> /// <param name="MyCatalogClass"></param> public static void CreateAccessTable(SqlConnection conn,string sqlstring,string AccessTableName, CatalogClass MyCatalogClass) { ADOX.TableClass tmpTable = new ADOX.TableClass(); tmpTable.ParentCatalog = MyCatalogClass; tmpTable.Name = AccessTableName; //待创建的数据表名 conn.Open();//连接Sql Server数据库 SqlCommand scm = new SqlCommand(sqlstring, conn); SqlDataReader myMdfReader = scm.ExecuteReader(); int MdfFieldCount = myMdfReader.FieldCount;//读取数据库表中的行数 string myTableFieldName; //待创建的数据表字段名称 string myTableFieldType; //待创建的数据表字段类型 for (int i = 0; i < MdfFieldCount; i++) { ADOX.ColumnClass col = new ADOX.ColumnClass(); col.ParentCatalog = MyCatalogClass; col.Properties["Jet OLEDB:Allow Zero Length"].Value = true; myTableFieldName = myMdfReader.GetName(i).ToString(); //获取数据表字段名称 col.Name = myTableFieldName; myTableFieldType = myMdfReader.GetFieldType(i).ToString(); //获取数据表字段类型 switch (myTableFieldType) { case "System.String": { tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adVarChar, 255); break; } case "System.Decimal": { col.Type = ADOX.DataTypeEnum.adDouble; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDouble, 20); break; } case "System.DateTime": { col.Type = ADOX.DataTypeEnum.adDate; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDate, 10); break; } case "System.Double": { col.Type = ADOX.DataTypeEnum.adDouble; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDouble, 20); break; } case "System.Int32": { col.Type = ADOX.DataTypeEnum.adSingle; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10); break; } case "System.Int16": { col.Type = ADOX.DataTypeEnum.adSingle; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10); break; } case "System.Int64": { col.Type = ADOX.DataTypeEnum.adSingle; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10); break; } case "System .Boolean": { col.Type = ADOX.DataTypeEnum.adBoolean; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adBoolean, 10); break; } case "System.Byte"://对应SQLSERVER中的tinyint数据类型 { col.Type = ADOX.DataTypeEnum.adUnsignedTinyInt ; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adUnsignedTinyInt,255); break; } case "System.Byte[]": { col.Type = ADOX.DataTypeEnum.adBinary; tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adBinary, 255); break; } default: break; } } MyCatalogClass.Tables.Append(tmpTable); System.Runtime.InteropServices.Marshal.ReleaseComObject(tmpTable); System.Runtime.InteropServices.Marshal.ReleaseComObject(MyCatalogClass); tmpTable = null; MyCatalogClass = null; conn.Close(); } 接下来就是如何来完成数据的读出与插入呢? 以下是利用T-SQL语句实现给Access数据表追加数据完成MDF向MDB文件的转换的方法(关键代码) string commandstring = "insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + mdbFileName + "';'admin';'',student)select * from student "; SqlCommand SqlToAccess = new SqlCommand(commandstring, conn); conn.Open(); SqlToAccess.ExecuteNonQuery();回答完毕 希望给分哈 如何解决“已有打开的与此命令相关联的DataReader,必须首先将它关闭。”错误? winform 中treeview的问题 改变本机IP 如何实现类似ArcGIS双击属性表定位到要素的功能 C#过滤字符,左起的三个字符替换掉 我用C#做的一个管理系统,大家看看可以吗?提提意见 如何搜索远程网站的目录 Unity 使用Bitmap.Save 崩溃 大神求解 BindingContext问题 如何在C#的WINDOWS应用程序中禁止运行一个程序的多个实例? 未将对象引用设置到对象的实例 求解啊 不知道哪儿出错了!多谢多谢!!本人新手 把表中数据显示到树形控件
件,ASP.NET下利用C#连接MDF的关键代码可表示为:
string mdfFileName = "Northwind";
string connstring="Data Source=.;initialcatalog="+mdfFileName+";integrated security=sspi;");
SqlConnection conn = new SqlConnection(connstring);
conn.Open();
其中mdfFileName表示待连接的MDF数据库(数据库名),实际应用时以上代码可封装成一个方法,将方法类型定义为sqlConnection,即方法返回值为sqlConnection类型,方法的形参为string类型,代表待连接的MDF数据库文件名。下面为方法的定义:
//定义连接DBF数据库方法
private sqlConnection OpenMdfDatabase(string databaseFileName)
{
string mdfFileName = databaseFileName;
//此处为连接MDF数据库的具体代码
return conn;
}
2.1创建MDB文件即创建Access数据库
.NET2.0框架下动态创建Access数据库需要在应用系统中添加引用“Microsoft ADD Ext.2.8 For DDL and Security”.
然后通过使用ADOX命名空间下CatalogClass类的Create方法实现,实现的关键代码为:
ADOX.CatalogClass myCatalogClass = new ADOX.CatalogClass();
myCatalogClass.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbFileName + ";");
其中变量mdbFileName表示待创建的Access数据库文件名(含路径和扩展名)。
2.2 创建Access数据表
Access数据表与MDF数据库一样都是属于二维关系数据库,即以每个字段为一列、每行为一条记录的数据集合。
在Access数据库中动态创建数据表的过程实际上就是创建数据库的结构,根据表格 1所提供的它们二者字段类型的对应关系,通过ADO.NET技术首先连接MDF文件,再利用ADO.NET Framework数据提供程序的DataReader对象即可取得MDF文件各字段属性(字段名称、类型等)。
.NET2.0框架下动态创建Access数据表也需要在应用系统中添加引用“Microsoft ADD Ext.2.8 For DDL and Security”,然后使用ADOX命名空间下TableClass类中的相关方法和属性实现。实现的关键代码如下:
//创建Access数据库文件
//mdbFileName表示待创建的Access数据库文件名(含绝对路径+文件名称+扩展名)。
string mdbFileName = @"c:\教务管理系统数据备份\" + txtAccName.Text.Trim() + ".mdb";
if (!mdbFileName.EndsWith(".mdb"))
{
mdbFileName += ".mdb";
}
if (File.Exists(mdbFileName))
{
Response.Write(" <script language=javascript>alert('此文件已存在,请重新输入!');location='xx1.aspx' </script>");
return;
}
ADOX.CatalogClass myCatalogClass = new ADOX.CatalogClass();
myCatalogClass.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbFileName + ";");
//创建Access数据表(条用以下方法)
SqlBackUpToAccess.CreateAccessTable(conn, "select * from student", "student", myCatalogClass);
以下是创建Access数据表的方法封装:
/// <summary>
/// 创建Access数据表
/// </summary>
/// <param name="conn">连接Sql Server数据库</param>
/// <param name="sqlstring">Sql Server数据库的表查询语句 如:select * from student表</param>
/// <param name="AccessTableName">要在Access中创建的表名</param>
/// <param name="MyCatalogClass"></param>
public static void CreateAccessTable(SqlConnection conn,string sqlstring,string AccessTableName, CatalogClass MyCatalogClass)
{
ADOX.TableClass tmpTable = new ADOX.TableClass();
tmpTable.ParentCatalog = MyCatalogClass;
tmpTable.Name = AccessTableName; //待创建的数据表名
conn.Open();//连接Sql Server数据库
SqlCommand scm = new SqlCommand(sqlstring, conn);
SqlDataReader myMdfReader = scm.ExecuteReader();
int MdfFieldCount = myMdfReader.FieldCount;//读取数据库表中的行数
string myTableFieldName; //待创建的数据表字段名称
string myTableFieldType; //待创建的数据表字段类型
for (int i = 0; i < MdfFieldCount; i++)
{
ADOX.ColumnClass col = new ADOX.ColumnClass();
col.ParentCatalog = MyCatalogClass;
col.Properties["Jet OLEDB:Allow Zero Length"].Value = true;
myTableFieldName = myMdfReader.GetName(i).ToString();
//获取数据表字段名称
col.Name = myTableFieldName;
myTableFieldType = myMdfReader.GetFieldType(i).ToString();
//获取数据表字段类型
switch (myTableFieldType)
{
case "System.String":
{
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adVarChar, 255);
break;
}
case "System.Decimal":
{
col.Type = ADOX.DataTypeEnum.adDouble;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDouble, 20);
break;
}
case "System.DateTime":
{
col.Type = ADOX.DataTypeEnum.adDate;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDate, 10);
break;
}
case "System.Double":
{
col.Type = ADOX.DataTypeEnum.adDouble;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adDouble, 20);
break;
}
case "System.Int32":
{
col.Type = ADOX.DataTypeEnum.adSingle;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10);
break;
}
case "System.Int16":
{
col.Type = ADOX.DataTypeEnum.adSingle;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10);
break;
}
case "System.Int64":
{
col.Type = ADOX.DataTypeEnum.adSingle;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adSingle, 10);
break;
}
case "System .Boolean":
{
col.Type = ADOX.DataTypeEnum.adBoolean;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adBoolean, 10);
break;
}
case "System.Byte"://对应SQLSERVER中的tinyint数据类型
{
col.Type = ADOX.DataTypeEnum.adUnsignedTinyInt ;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adUnsignedTinyInt,255);
break;
}
case "System.Byte[]":
{
col.Type = ADOX.DataTypeEnum.adBinary;
tmpTable.Columns.Append(col, ADOX.DataTypeEnum.adBinary, 255);
break;
}
default:
break;
}
}
MyCatalogClass.Tables.Append(tmpTable);
System.Runtime.InteropServices.Marshal.ReleaseComObject(tmpTable);
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyCatalogClass);
tmpTable = null;
MyCatalogClass = null;
conn.Close();
}
接下来就是如何来完成数据的读出与插入呢?
以下是利用T-SQL语句实现给Access数据表追加数据完成MDF向MDB文件的转换的方法(关键代码)
string commandstring = "insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + mdbFileName + "';'admin';'',student)select * from student ";
SqlCommand SqlToAccess = new SqlCommand(commandstring, conn);
conn.Open();
SqlToAccess.ExecuteNonQuery();
回答完毕 希望给分哈