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>