当前位置:编程学习 > C#/ASP.NET >>

这个access读写类在xp底下工作好好的,win7就不行,怎么改?

在xp底下好好地,在win7下一 this._conn.Open(); 就异常,怎么改?


using System;
using System.Data.OleDb;
using System.Data;
using System.Data.Sql;
using com.Db;
using com.Helper;
using com.Util;
using System.Text;

namespace com.Db.Access
{
    public class AccessSqlDbImpl : ISqlDb
    {
        #region 成员

        private OleDbConnection _conn;
        private OleDbCommand _command;
        private string serverip;
        private string user;
        private string password;
        private string database;

        #endregion

       #region 构造函数

        public AccessSqlDbImpl(string serverip, string user, string password, string database)
        {

            //if (serverip.ToLower().IndexOf(".mdb") < 0) serverip = serverip + ".mdb";
           
           
            this.serverip = serverip;  //这个为数据库的路径,为当前程序目录,比如:D:\\Db\\
            this.user = user;
            this.password = password;
            this.database = database; //这个为Access数据库的目录名称,比如: abc.mdb


            string DataSource = serverip;

            string oleStr = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=\"" + serverip + "\";" +
                             "Persist Security Info=False;Jet OLEDB:DataBase Password=\"" + password + "\"";

          
            this._conn = new OleDbConnection(oleStr);

            this._command = _conn.CreateCommand();
        }

        #endregion

        #region ISqlDb 成员

        /// <summary>
        /// 打开一个数据库连接
        /// </summary>
        /// <returns></returns>
        public bool GetConnection()
        {
            try
            {
                this._conn.Open();

                return true;
            }
            catch (OleDbException err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用GetConnection函数产生异常", msg, msg.Length, NumType.DecimalString);

                return false;
            }
            catch (Exception err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用GetConnection函数产生异常", msg, msg.Length, NumType.DecimalString);

                return false;
            }
        }

        public void CloseConnect()
        {
            try
            {
                if (this._conn != null)
                {
                    this._conn.Close();
                }
            }
            catch (OleDbException err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用CloseConnect函数产生异常", msg, msg.Length, NumType.DecimalString);

               
            }
            catch (Exception err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用CloseConnect函数产生异常", msg, msg.Length, NumType.DecimalString);

               
            }
        }

        public void BeginTransaction()
        {
            return;
        }

        public void RollBack()
        {
            return;
        }

        public void Commit()
        {
            return;
        }

        public DataSet Query(string sql)
        {
            this._command.CommandText = sql;

            try
            {

                OleDbDataAdapter sda = new OleDbDataAdapter(_command);

                //填充的时候带主键

                //sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;

                DataSet set = new DataSet();

                sda.Fill(set, "T");

                return set;
            }
            catch (OleDbException err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message + " Sql:" + sql);

                Log.Trace("调用Query函数产生OleDbException异常", msg, msg.Length, NumType.DecimalString);

                return null;
            }
            catch (Exception err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用Query函数产生为知的异常", msg, msg.Length, NumType.DecimalString);

                return null;
            }
        }

        public DataSet Query(string sql, int startRow, int maxReturnRows)
        {
            this._command.CommandText = sql;

            try
            {
                OleDbDataAdapter sda = new OleDbDataAdapter(sql, this._conn);

                //填充的时候带主键

                //sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;

                DataSet set = new DataSet();

                sda.Fill(set, startRow, maxReturnRows, "T");

                return set;
            }
            catch (OleDbException err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用Query2函数产生异常", msg, msg.Length, NumType.DecimalString);

                return null;
            }
            catch (Exception err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用Query2函数产生异常", msg, msg.Length, NumType.DecimalString);

                return null;
            }
        }


        public System.Data.DataTable GetDataTable(string sql, string tbname)
        {
            DataSet ds = Query(sql);

            if (ds==null || ds.Tables==null || ds.Tables.Count == 0) return null;

            ds.Tables["T"].TableName = tbname;

            return ds.Tables[tbname];


        }

        public System.Data.DataRow GetDataRow(string sql)
        {
            DataTable dt = GetDataTable(sql, "T");

            if (dt == null || dt.Rows.Count == 0) return null;


            return dt.Rows[0];

        }


        /// <summary>
        /// 执行一个数据插入、更新、删除命令,如果声明了事务就在事务中执行
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Excute(string sql)
        {
            this._command.CommandText = sql;

            try
            {

                //对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1

                return _command.ExecuteNonQuery();
            }
            catch (OleDbException err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用Excute函数产生异常", msg, msg.Length, NumType.DecimalString);

                
                return -2;

            }
            catch (Exception err)
            {
                byte[] msg = Encoding.Unicode.GetBytes(err.Message);

                Log.Trace("调用Excute函数产生异常", msg, msg.Length, NumType.DecimalString);


                return -2;
            }
        }

        #endregion
    }
}
--------------------编程问答-------------------- 错误的具体信息呢,是不是权限问题 --------------------编程问答-------------------- 我第一个想到的是操作系统位数问题
XP是32位,
如果你的win7是64位的,
从“项目属性 -> 生成 -> 目标平台”,把“Any CUP”换成“86位”(默认是Any CUP)。
重新生成下就OK

如果你的win7也是32位,就根据错误信息从别的方面考虑原因吧 --------------------编程问答-------------------- 错误信息,以及运行平台贴出,你这样别人怎么帮你? --------------------编程问答-------------------- Provider=Microsoft.JET.OLEDB.4.0;
win7不是这个了 --------------------编程问答--------------------  晚上回去才能给出错误信息,办公室还是xp系统!楼上win7 改成什么了? Microsoft.JET.OLEDB.5.0;
? --------------------编程问答-------------------- 我也遇到过。你以管理员身份运行看看 --------------------编程问答-------------------- 以管理或者xp sp3模式运行都不行的! --------------------编程问答--------------------  2楼,我的两台笔记本一台64,一台32,现在用64编译的,不过在win7 32位 下运行时也报错的,编译还没试,晚上回去才能试~ --------------------编程问答-------------------- 我写了好多个企业站也是access,就是没遇到你这样的问题!我的连接字符串是写在web.config里的,你调试一下看看 --------------------编程问答--------------------
引用 4 楼 fuxiyang 的回复:
Provider=Microsoft.JET.OLEDB.4.0;
win7不是这个了

操作系统变了,但access的版本驱动和操作系统没关系吧,值要你用的是03版的office,应该都可以的 --------------------编程问答-------------------- office是2010 --------------------编程问答-------------------- 装的是office2010,不过那个mdb文件是2003版本的! --------------------编程问答--------------------
引用 12 楼 camdw_1 的回复:
装的是office2010,不过那个mdb文件是2003版本的!

我和你同样的问题,变通解决了一下。

conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TallyDB.mdb;User ID=Admin;Password=;Jet OLEDB:Database Password=mydb");
            try
            {
                conn.Open();
            }
            catch
            {
                conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TallyDB.mdb;Persist Security Info=True;Jet OLEDB:Database Password=mydb");
                conn.Open();
            }
--------------------编程问答-------------------- 主要主编译生成时选择平台问题,在项目属性里改目标平台为X86 --------------------编程问答-------------------- 先尝试使用OleDB4.0来连接,不行的话,换office2010的oledb.12.0 --------------------编程问答-------------------- 要是你的win7是32位的,可以试试注册一下msjetoledb40.dll看看,我的是64的,没成功。 --------------------编程问答--------------------
引用 10 楼 wuzhengqing1 的回复:
引用 4 楼 fuxiyang 的回复:

Provider=Microsoft.JET.OLEDB.4.0;
win7不是这个了

操作系统变了,但access的版本驱动和操作系统没关系吧,值要你用的是03版的office,应该都可以的

Win7上的MDAC确实不一样了,具体怎么个不一样法儿,倒是没弄明白。 --------------------编程问答-------------------- 现在选择x86又遇到问题了,我的解决方案里面有5个项目,现在照那个生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86  

 只能对一个项目修改,其他还是默认any cpu,想对其他4个项目新建x86时报错,未能创建此平台,因为已存在同名的解决方案平台 --------------------编程问答-------------------- 在生成-常规[目标平台]那里选择就行啊,不用新建。 --------------------编程问答--------------------
引用 19 楼 fuxiyang 的回复:
在生成-常规[目标平台]那里选择就行啊,不用新建。

解决方案的属性中的生成,不是VS环境里面的生成。 --------------------编程问答-------------------- 照大家的方法可以了,现在还剩一个问题,缺少devexpress v7.2.2的注册方法,现在注册机在xp底下工作的好好的,在win7 64底下工作不了,管理员权限也不行 ,提示"unable to find a version of the runtime to run this application".我看意思好像是缺少运行库,关键win7 64 自带,netfframework4,0,而且,netfarmework2.0和3.5在win7底下装不了啊~着急!高版本的devexpress(例如v11)又和低版本无法兼容~  
  那个bat批处理破解我也用了,还是不行啊~ 不能开注册破解话题,只好在这顶下了~
  不要问为什么非要用v7.2.2,前辈留下的啊~ --------------------编程问答-------------------- 顶!现在主要是上面那个注册机的问题,在xp底下工作的好好的,现在在win7 64下注_册机程序无法运行(管理员权限或者/xp sp3兼容模式均不行),提示"unable to find a version of the runtime to run this application". 一开始怀疑win7 64 带的是.netframework 4.0,有可能这个注_册机需要的是.netframework 2.0或3.5的运行环境,试着安装了一下,.netframework2.0根本不能安装,.netframework3.5在控制面板/程序与功能/ 打开/关闭windows功能里面去掉 3.5的选项之后可以勉强安装,不过安装到一半还是报错推出,也就是注_册机还是无法使用,后来在win7 32bit下面试了一下,带的有.netframework 3.5,不过也同样运行不了,请教下怎样才能运行这个注_册机呢? 
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,