用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
ronaldo17的公告
<!--在线人数计算--> <br>本blog当前在线人数: <b><script src=http://fastonlineusers.com/online.php?d=http://blog.csdn.net/ronaldo17/></script></b> <!-- Blog日历表开始 --> <script language="javascript"> var diarydays="<2005-10-10><2005-10-09><2005-09-26><2005-09-25><2005-09-24><2005-09-22><2005-09-21><2005-09-20><2005-09-19><2005-09-16><2005-09-15><2005-09-14><2005-09-13><2005-09-12><2005-08-30><2005-08-29><2005-08-26><2005-08-25><2005-08-24><2005-08-23><2005-08-19><2005-08-17><2005-08-16><2005-08-12><2005-08-11><2005-08-10><2005-08-09><2005-08-08><2005-07-07><2005-07-04><2005-06-29><2005-06-28><2005-06-27><2005-06-24><2005-06-23><2005-06-21><2005-06-14><2005-06-13><2005-06-06><2005-06-05><2005-05-31><2005-05-26><2005-05-24><2005-05-23><2005-05-20><2005-05-17><2005-05-16><2005-05-13><2005-05-08><2005-04-29><2005-04-28><2005-04-26><2005-04-25><2005-04-23><2005-04-22><2005-04-21><2005-04-20><2005-04-19><2005-04-18><2005-04-15><2005-04-14><2005-04-13><2005-04-12><2005-04-11><2005-04-08><2005-04-05><2005-04-04><2005-04-02><2005-03-30><2005-03-29><2005-03-28><2005-03-27><2005-03-26><2005-03-24><2005-03-23><2005-03-22><2005-03-21><2005-03-18><2005-03-16><2005-03-15><2005-03-13><2005-03-12><2005-03-11><2005-03-10><2005-03-09><2005-03-08><2005-03-07><2005-03-05><2005-03-02><2005-03-01><2005-02-27><2005-02-26><2005-02-25><2005-02-22><2005-02-20><2005-02-19><2005-02-18><2005-02-17><2005-02-16><2005-02-06><2005-02-04><2005-02-02><2005-01-31><2005-01-29><2005-01-25><2005-01-24><2005-01-17><2005-01-13><2005-01-12><2005-01-10><2005-01-07><2005-01-04><2004-12-31><2004-12-29><2004-12-27><2004-12-26><2004-12-24><2004-12-22><2004-12-20><2004-12-19><2004-12-17><2004-12-16><2004-12-14><2004-12-08><2004-12-04><2004-12-03><2004-11-28><2004-11-27><2004-11-23><2004-11-20><2004-11-17><2004-11-12><2004-11-10><2004-11-08><2004-11-04><2004-11-02><2004-11-01><2004-10-31><2004-10-30><2004-10-29><2004-10-26><2004-10-23><2004-10-18><2004-10-16><2004-10-15><2004-10-14><2004-10-11><2004-09-07><2004-09-06><2004-09-05><2004-09-03><2004-09-02><2004-09-01><2004-08-31><2004-08-30><2004-08-29><2004-08-28><2004-08-27><2004-08-26><2004-08-25><2004-08-24><2004-08-23><2004-08-22><2004-08-21><2004-08-20><2004-08-19><2004-08-18><2004-08-17><2004-08-15><2004-08-13><2004-08-12><2004-08-11><2004-08-10><2004-08-09><2004-08-08><2004-08-06><2004-08-05><2004-08-04><2004-08-03><2004-08-02><2004-08-01><2004-07-31><2004-07-30><2004-07-29><2004-07-27><2004-07-26><2004-07-25><2004-07-22><2004-07-21><2004-07-20><2004-07-19><2004-07-18><2004-07-16><2004-07-15><2004-07-14><2004-07-13><2004-07-12><2004-07-11><2004-07-10><2004-07-09><2004-07-08><2004-07-06><2004-07-05><2004-07-04><2004-07-03><2004-07-02><2004-07-01><2004-06-30><2004-06-27><2004-06-26>"; </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style> .calendarBigBorder { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; text-decoration: none; width: 170; background-color: #FFFFFF; font-size: 9pt;border:1px dotted #999; } .calendarTd { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #000000; background-color: #eeeeee; height: 18px; width: 11%; text-align: center;} .calendarMInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; text-decoration: none; background-color: #FFFFFF; height: 15px; border: 1px solid #666666; width: 19px; color: #0099FF;} .calendarYInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #0099FF; text-decoration: none; background-color: #FFFFFF; height: 15px; width: 34px; border: 1px solid #666666;} .calendarMonthTitle { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; height: 24px; text-align: center; color: #333333; text-decoration: none; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: none; border-top-color: #999999; border-right-color: #999999; border-bottom-color: #999999; border-left-color: #999999;} .calendarNow { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: bold; color: #000000; background-color: #C0C9D3; height: 18px; text-align: center;} .calendarDaySat { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarDaySun { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarLink { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; color: #333333; text-decoration: none; background-color: #E7E7F6; text-align: center; height: 18px;} .categoryTxt { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; line-height: 23px; color: #333333; text-decoration: none;} .categoryTable { border-right-width: 1px; border-bottom-width: 1px; border-right-style: solid; border-bottom-style: solid; border-left-style: none; border-right-color: #000000; border-bottom-color: #000000; border-top-width: 1px; border-top-style: solid; border-top-color: #71b99c;} </style> <SCRIPT LANGUAGE="JavaScript"> var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二"); var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); var days = new Array("日","一", "二", "三","四", "五", "六"); var classTemp; var calendarHover="calendarHover"; var today=new getToday(); var year=today.year; var month=today.month; var newCal; //得到某月天数 function getDays(month, year) { if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28; else return daysInMonth[month]; } //得到当天时间信息 function getToday() { this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate(); } //生成日历 function Calendar() { newCal = new Date(year,month,1); //当前月的第一天 today = new getToday(); var day = -1; //用来判断日历中是否为当天 var startDay = newCal.getDay(); //当月开始时间 var endDay=getDays(newCal.getMonth(), newCal.getFullYear());//当月结束时间 var daily = 0; //用来生成日历中的天数值 if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var caltable = document.all.caltable.tBodies.calendar; //得到日历表格的集合 var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear()); //得到当月天数 //生成日历 for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++) for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++) { var cell = caltable.rows[intWeek].cells[intDay]; //得到单元袼 //生成字符串用于判断当天是否有日志 var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); if ((intDay == startDay) && (0 == daily)){ daily = 1;} var daytemp=daily<10?("0"+daily):(daily); var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">"; //选择样式 if(day==daily) cell.className="calendarNow"; else if(diarydays.indexOf(d)!=-1) cell.className="calendarLink"; else if(intDay==6) cell.className = "calendarDaySat"; else if (intDay==0) cell.className ="calendarDaySun"; else cell.className="calendarTd"; //生成值 if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } document.all.year.value=year; document.all.month.value=month+1; } function subMonth() { if ((month-1)<0) { month=11; year=year-1; } else { month=month-1; } Calendar(); } function addMonth() { if((month+1)>11) { month=0; year=year+1; } else { month=month+1; } Calendar(); } //得到响应事件 function getDiary() { var mon=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); var day=event.srcElement.innerText<10?("0"+event.srcElement.innerText):(event.srcElement.innerText); var d="<"+newCal.getFullYear()+"-"+mon+"-"+day+">"; if ("TD" == event.srcElement.tagName) if (("" != event.srcElement.innerText)&&(diarydays.indexOf(d)!=-1)) { diary.location="/chensheng913/archive/"+newCal.getFullYear()+"/"+mon+"/"+day+".aspx"; window.location.href = diary.location; } } function setDate() { if (document.all.month.value<1||document.all.month.value>12) { alert("月的有效范围在1-12之间!"); return; } year=Math.ceil(document.all.year.value); month=Math.ceil(document.all.month.value-1); Calendar(); } </SCRIPT> <table border="0" cellpadding="0" cellspacing="1" class="calendarBigBorder" id="caltable" width="200"> <thead> <tr align="center" valign="middle"> <td colspan="7" class="calendarMonthTitle"> <input name="year" type="text" class="calendarYInput" size="3" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">年 <input name="month" type="text" class="calendarMInput" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">月 [<a onClick="addMonth()" href="javascript:;">下月</a>] [<a onClick="subMonth()" href="javascript:;">上月</a>]</td> </tr> <tr align="center" valign="middle"> <SCRIPT LANGUAGE="JavaScript"> document.write("<TD class=calendarDaySun id=diary>" + days[0] + "</TD>"); for (var intLoop = 1; intLoop < days.length-1; intLoop++) document.write("<TD class=calendarTd id=diary>" + days[intLoop] + "</TD>"); document.write("<TD class=calendarDaySat id=diary>" + days[intLoop] + "</TD>"); </SCRIPT> </TR> </thead> <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()" onmouseup=document.selection.empty() oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforecopy="return false" oncopy=document.selection.empty() onselect=document.selection.empty()> <SCRIPT LANGUAGE="JavaScript"> for (var intWeeks = 0; intWeeks < 6; intWeeks++) { document.write("<TR style='cursor:hand'>"); for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=calendarTd onMouseover='{classTemp=this.className;this.className=calendarHover}' onMouseOut='this.className=classTemp'></TD>"); document.write("</TR>"); } </SCRIPT> </tbody> </table> <script LANGUAGE="JavaScript"> Calendar(); </script> <!-- Blog日历表结束 --> <marquee direction=up height=80 scrollamount=1> 站长档案:<br> 姓名:shiqing <br> 昵称:闷炮<br> E:shiqingstudio@yahoo.com.cn<br> qq:16398943<br> </marquee><HR> <script>var s="http://www.google.com/search?hl=zh-CN&lr=lang_zh-CN&q=";</script><div align="center"><a href="http://www.google.com"><img border="0" src="http://www.google.com/logos/Logo_25wht.gif"></a><input name="q" type="text" value=""> <input name="btnG" type="button" value="搜索" onclick="window.open(s+document.all.q.value)"></div><br><br><hr> </script>
文章分类
友情连接
石头记
存档

原创  java里的离线数据集 收藏

1       前言

听说在java里面一直没有封装很好的类似dataset的离线数据集,但是java里面同样提供了封装的不好的离线数据集rowset,在早些时候的jdk版本(jdk1.4及以前)其实已经提供了rowsetjar包,但是sun公司只提供了5个接口,并没有提供接口的实现,而我们要完成我们想要的工作就必须自己写实现,但同时,由于广大网友的要求(觉得这样实在不方便)sun公司又单独提供了一个有实现的rowset.jar包,放在sun的官方网站上供人们下载和使用,不过在他的sun官方网站上面该jar包的名字是jdbc_rowset_tiger-1_0_1-mrel-jwsdp.zip,在jdk1.5里面sun公司把这个jar包重写了实现,所以我们如果下载了sun公司单独提供的rowsetjar包或者安装了jdk1.5,我们都可以轻松的感受sun公司的离线数据集的快乐。

2       准备工作

在使用这个下载的离线数据集包的时候,我们首先要做的一件事就是把他改成中国地区能使用的jar包,因为他提供的这个jar包默认状态下是英文地区使用的,如果不这样做的话只要调用new CachedRowSetImpl(),就可以创建一个CachedRowSet对象,但就是这个new CachedRowSetImpl(),在使用时程序执行这个语句会抛出异常。根本用不了。

解决方法:

1          解压jdbc_rowset_tiger-1_0_1-mrel-ri.zip,产生rowset.jar文件。

2          再解压rowset.jar文档,在产生的com/sun/rowset目录下找到RowSetResourceBundle.properties文件。

3          RowSetResourceBundle.properties更名为

RowSetResourceBundle_CN.properties

4          重新创建rowset.jar包说明:这里_CN表示所处中国。不同的国家,这个名称不同经过以上的步骤就可以正常使用new CachedRowSetImpl().

3       rowset简介

Java 5Java Database Connectivity (JDBC)方面加强了支持,其中加入了新的包javax.sql.rowsetjavax.sql.rowset.serialjavax.sql.rowset.spi。从RowSet接口继承规定了五个新的接口:

1.      CachedRowSet CachedRowset可以不用与数据源建立长期的连接,只有当从数据库读取数据或是往数据库写入数据的时候才会与数据库建立连接,它提供了一种轻量级的访问数据库的方式,其数据均存在内存中。

2.       JdbcRowSet:对ResultSet的对象进行包装,使得可以将ResultSet对象做为一个JavaBeans ™ 组件。

3.       FilteredRowSet:继承自CachedRowSet,可以根据设置条件得到数据的子集。

4.       JoinRowSet继承自CachedRowSet,可以将多个RowSet对象进行SQL Join语句的合并。

5.      WebRowSet:继承自CachedRowSet,可以将WebRowSet对象输出成XML格式。

4       实现

由于我个人体会这块最有用并且最基础的是CachedRowSet部分,所以我只是做了CachedRowSet的实现例子。

CachedRowSet可以通过调用populate(ResuletSet rs)来生成数据,一旦获得数据,CachedRowSet就可以断开与数据库的连接,直到往数据库写入数据的时候才需建立连接。

例子代码如下:

package src;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.RowSet;

import com.sun.rowset.CachedRowSetImpl;

 

public class testCachedRowSet {

 

       public static void testCachedRowSet() {

      

       }

      

       public static com.sun.rowset.CachedRowSetImpl Query_all() throws SQLException{

              Connection conn = null;

              String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset";

              String user="sa";

              String password="sa";

           // 获得数据库连接

              conn= DriverManager.getConnection(url,user,password);

              java.sql.Statement stmt = conn.createStatement();

              // 查询数据库,获得表数据

              ResultSet rs =  stmt.executeQuery("select * from test");                                 // 根据ResultSet对象生成CachedRowSet类型的对象

              CachedRowSetImpl crs = new CachedRowSetImpl();

              crs.populate(rs);

              // 关闭ResultSet

              rs.close();

              // 关闭数据库的连接

              conn.close();

              return crs;

       }

       public static void main(String[] args) throws SQLException {

              String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";

              Connection conn = null;

              String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset;SelectMethod=Cursor";//最后注意事项的部分

              String user="sa";

              String password="sa";

                     try {

                            Class.forName(driver).newInstance();

                            CachedRowSetImpl crs = new CachedRowSetImpl();

                            crs=Query_all();

                         crs.setTableName("test");

                         crs.next();

                         //改操作   

                         crs.updateString(1, "434");

                         //查操作

                         String id = crs.getString("ID");

                         System.out.println(id);

                         //删操作

                         crs.deleteRow();

                         crs.updateRow();

                         // 重新获取与数据库的连接

                         conn= DriverManager.getConnection(url,user,password);

                         // CachedRowSet的内容更新到数据库

                         crs.acceptChanges(conn);

                         // 关闭CachedRowSet

                         crs.close();

                         // 关闭数据库连接

                         conn.close();

                     } catch (InstantiationException e) {

                            e.printStackTrace();

                     } catch (IllegalAccessException e) {

                            e.printStackTrace();

                     } catch (ClassNotFoundException e) {

                            e.printStackTrace();

                     }

       }

}

5       注意事项:

JDBC的时候发现一个问题:“java.sql.SQLException:[Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.”查了一下微软的官方网站原来才发现,我们使用JDBC的时候所打开的数据库连接的默认设置是“手动模式下的直接连接模式”,在该模式下,不能对SQLServer 的数据库做批量操作,连微软自己都承认这是设计的问题,其他数据库暂时没有发现这个问题,要改变的话我们必须对连接字符串做如下修改:“String url="jdbc:microsoft:sqlserver://localhost;DatabaseName;SelectMethod=Cursor";”以保证我们的模式是光标模式而不是直接模式。

 

6       参考文献:

http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B313181

http://www-128.ibm.com/developerworks/cn/java/j-zhanghz2/

发表于 @ 2006年05月28日 21:53:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:用JDBC的同志们注意了 | 新一篇:SUN修成了正果

  • 发表评论
  • 评论内容:
  •  
Copyright © ronaldo17
Powered by CSDN Blog