这个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里的,你调试一下看看 --------------------编程问答--------------------
操作系统变了,但access的版本驱动和操作系统没关系吧,值要你用的是03版的office,应该都可以的 --------------------编程问答-------------------- office是2010 --------------------编程问答-------------------- 装的是office2010,不过那个mdb文件是2003版本的! --------------------编程问答--------------------
我和你同样的问题,变通解决了一下。
--------------------编程问答-------------------- 主要主编译生成时选择平台问题,在项目属性里改目标平台为X86 --------------------编程问答-------------------- 先尝试使用OleDB4.0来连接,不行的话,换office2010的oledb.12.0 --------------------编程问答-------------------- 要是你的win7是32位的,可以试试注册一下msjetoledb40.dll看看,我的是64的,没成功。 --------------------编程问答--------------------
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();
}
Win7上的MDAC确实不一样了,具体怎么个不一样法儿,倒是没弄明白。 --------------------编程问答-------------------- 现在选择x86又遇到问题了,我的解决方案里面有5个项目,现在照那个生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86
只能对一个项目修改,其他还是默认any cpu,想对其他4个项目新建x86时报错,未能创建此平台,因为已存在同名的解决方案平台 --------------------编程问答-------------------- 在生成-常规[目标平台]那里选择就行啊,不用新建。 --------------------编程问答--------------------
解决方案的属性中的生成,不是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#