java web项目中将数据库从SQL Server转为Access出现的常见错误

1.access数据库里中文显示正常,但是页面上显示的中文字符是乱码。

原因:

没有设置默认的access数据库连接的编码方式


解决方案:

如果之前连接SQL Server数据库是遵照jdbc标准的话,应该会有如下代码

<span style="font-size:14px;">private Connection createConnection() throws SQLException{
		if(SQL_account == "" || SQL_account == null || SQL_account.isEmpty()){
			Connection realConn =DriverManager.getConnection(url);
			MyConnection myConnection =new MyConnection(realConn,this);
			return myConnection;
		}else{
			Connection realConn =DriverManager.getConnection(url,SQL账户名,SQL密码);
			MyConnection myConnection =new MyConnection(realConn,this);
			return myConnection;
		}
		
	}</span>

将如上代码改为

<span style="font-size:14px;">private Connection createConnection() throws SQLException{
		if(SQL_account == "" || SQL_account == null || SQL_account.isEmpty()){
			Properties prop = new Properties();   
		        prop.put("charSet", "gbk");    //解决中文乱码
			Connection realConn =DriverManager.getConnection(url,prop);
			MyConnection myConnection =new MyConnection(realConn,this);
			return myConnection;
		}else{
			Properties prop = new Properties();   
		        prop.put("charSet", "gbk");    //解决中文乱码
		        prop.put( "user", SQL_account );
		        prop.put( "password", SQL_key );
			Connection realConn =DriverManager.getConnection(url,prop);
			MyConnection myConnection =new MyConnection(realConn,this);
			return myConnection;
		}	
	}</span>



2.row_number() over()是SQL Server的函数,然而Access中不支持row_number() over()


此段来自百度


ACCESS的分页之道,Access中实现row_number() over()聚合函数功能

oracle的分页查询可以利用rowid伪列。 

db2的分页查询可以利用row_number() over()聚合函数。 

mysql有limit。 access仿佛先天缺陷,仅提供了top n。

那如何利用top来实现分页查询呢?


假设在access中有表t1 

create table t1( tc1 varchar(50) not null primary key, tc2 varchar(30), tc3 varchar(30) )

 随机插入20条数据。

如果以每页5条来显示数据,如果要显示11至15条如何显示?


利用top n功能,前11条可以用以下sql完成。 

select top 11 tc1,tc2,tc3 from t1

同样前15条也可以这样: 

select top 15 tc1,tc2,tc3 from t1

 

想要得到11条到15条,估计一般都会想到差集,但access没提供差集except,可以利用not in实现。 

select top 15 tc1,tc2,tc3 from t1 where tc1 not in (select top 10 tc1 from t1)

如果是一个比较大的表,用not in不能利用索引,使和效率极其低下,又该如何呢?

可以利用左连接来解决问题 

select a.* from select top15 tc1,tc2,tc3 from t1) a left join select top 10 tc1,tc2,tc3 from t1 ) b on a.tc1=b.tc1 where iif(b.tc1,'0','1')='1'

这种sql的好处是显而易见的,他有效的利用了表的主键索引。

当然,由于access不能这样判断b.tc1 is null,所以要改用iif(b.tc1,'0','1')='1' 来曲线救国


此段来自百度


我的修改如下:


连接SQL Server时使用的一段语句

<span style="font-size:14px;">sql="select * from (select ROW_NUMBER() over(order by pubTime DESC) rownumber,* from Zcfg where visible=0) temp where temp.rownumber<=20";</span>



对应的修改为连接Access数据库时的语句为

sql="select top 20 * from (select * from dbo_Zcfg  order by pubTime DESC ) where visible=0";


3.从Access中读取中文字符数据时常出现乱码


可以利用如下方法解决

(注:rs 为  ResultSet 对象,news是一个model)

修改前:

<span style="font-size:14px;">news.setTitle(rs.getString("title"))</span>

修改后:

<span style="font-size:14px;">news.setTitle(new String(rs.getBytes("title"),"gbk"));</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值