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

camdw_1 2011-12-01 01:58:41
在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
}
}
...全文
405 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
camdw_1 2011-12-04
  • 打赏
  • 举报
回复
照大家的方法可以了,现在还剩一个问题,缺少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,前辈留下的啊~
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fuxiyang 的回复:]
在生成-常规[目标平台]那里选择就行啊,不用新建。
[/Quote]
解决方案的属性中的生成,不是VS环境里面的生成。
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
在生成-常规[目标平台]那里选择就行啊,不用新建。
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
现在选择x86又遇到问题了,我的解决方案里面有5个项目,现在照那个生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86

只能对一个项目修改,其他还是默认any cpu,想对其他4个项目新建x86时报错,未能创建此平台,因为已存在同名的解决方案平台
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuzhengqing1 的回复:]
引用 4 楼 fuxiyang 的回复:

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

操作系统变了,但access的版本驱动和操作系统没关系吧,值要你用的是03版的office,应该都可以的
[/Quote]
Win7上的MDAC确实不一样了,具体怎么个不一样法儿,倒是没弄明白。
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
要是你的win7是32位的,可以试试注册一下msjetoledb40.dll看看,我的是64的,没成功。
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
先尝试使用OleDB4.0来连接,不行的话,换office2010的oledb.12.0
DENQH 2011-12-01
  • 打赏
  • 举报
回复
主要主编译生成时选择平台问题,在项目属性里改目标平台为X86
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 camdw_1 的回复:]
装的是office2010,不过那个mdb文件是2003版本的!
[/Quote]
我和你同样的问题,变通解决了一下。

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();
}
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
装的是office2010,不过那个mdb文件是2003版本的!
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
office是2010
_老吴 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fuxiyang 的回复:]

Provider=Microsoft.JET.OLEDB.4.0;
win7不是这个了
[/Quote]
操作系统变了,但access的版本驱动和操作系统没关系吧,值要你用的是03版的office,应该都可以的
_老吴 2011-12-01
  • 打赏
  • 举报
回复
我写了好多个企业站也是access,就是没遇到你这样的问题!我的连接字符串是写在web.config里的,你调试一下看看
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
2楼,我的两台笔记本一台64,一台32,现在用64编译的,不过在win7 32位 下运行时也报错的,编译还没试,晚上回去才能试~
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
以管理或者xp sp3模式运行都不行的!
ohkuy 2011-12-01
  • 打赏
  • 举报
回复
我也遇到过。你以管理员身份运行看看
camdw_1 2011-12-01
  • 打赏
  • 举报
回复
晚上回去才能给出错误信息,办公室还是xp系统!楼上win7 改成什么了? Microsoft.JET.OLEDB.5.0;
?
fuxiyang 2011-12-01
  • 打赏
  • 举报
回复
Provider=Microsoft.JET.OLEDB.4.0;
win7不是这个了
DENQH 2011-12-01
  • 打赏
  • 举报
回复
错误信息,以及运行平台贴出,你这样别人怎么帮你?
淡默 2011-12-01
  • 打赏
  • 举报
回复
我第一个想到的是操作系统位数问题
XP是32位,
如果你的win7是64位的,
从“项目属性 -> 生成 -> 目标平台”,把“Any CUP”换成“86位”(默认是Any CUP)。
重新生成下就OK

如果你的win7也是32位,就根据错误信息从别的方面考虑原因吧
加载更多回复(1)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧