现在遇到一个非常棘手的问题就是:在ASP.NET2.0中 现在只有MDF文件  需要将它集合到代码中,但是呢?读取的时候必须是MDB文件,有人知道这个问题的解决方法不?

解决方案 »

  1.   

     实现的过程可分为三个主要步骤:创建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();
    回答完毕  希望给分哈