数据分类:
protected function insert(){
$res = array() //存放id与seq
$data = mysql_query("select * from A") //取出所有的数据
$count = count($data) //数据总条数
for($i = 0$i<$count$i++){
if(array_key_exist($i,$res))continue
$star = 0 //seq的值
for($j = $i+1$j<$count$j++){
if($data[$i]['classId'] == $data[$j]['classId']){
$res[$j]=$star //将classId相同的数据的id当做键名放入数组
$star++
}
}
return $res
}
返回的$res ,以id为键名,seq值为值:('1'=>'0', '5'=>'2', '10'=>'3'...)大概这个样子。
循环插入数据库:
foreach($res $k=>$v){mysql_query("insert into A (seq) values ('$v') where id=$k ")
}
获取新插入Oracle数据库Sequence值的5种方法如下://公共代码:得到数据库连接
public Connection getConnection() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:dbname", "username", "password")
return conn
}
//方法一
//先用select seq_t1.nextval as id from dual 取到新的sequence值。
//然后将最新的值通过变量传递给插入的语句:insert into t1(id) values(?)
//最后返回开始取到的sequence值。
//这种方法的优点代码简单直观,使用的人也最多,缺点是需要两次sql交互,性能不佳。
public int insertDataReturnKeyByGetNextVal() throws Exception {
Connection conn = getConnection()
String vsql = "select seq_t1.nextval as id from dual"
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql)
ResultSet rs=pstmt.executeQuery()
rs.next()
int id=rs.getInt(1)
rs.close()
pstmt.close()
vsql="insert into t1(id) values(?)"
pstmt =(PreparedStatement)conn.prepareStatement(vsql)
pstmt.setInt(1, id)
pstmt.executeUpdate()
System.out.print("id:"+id)
return id
}
//方法二
//先用insert into t1(id) values(seq_t1.nextval)插入数据。
//然后使用select seq_t1.currval as id from dual返回刚才插入的记录生成的sequence值。
//注:seq_t1.currval表示取出当前会话的最后生成的sequence值,由于是用会话隔离,只要保证两个SQL使用同一个Connection即可,对于采用连接池应用需要将两个SQL放在同一个事务内才可保证并发安全。
//另外如果会话没有生成过sequence值,使用seq_t1.currval语法会报错。
//这种方法的优点可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码,缺点是需要两次sql交互,性能不佳,并且容易产生并发安全问题。
public int insertDataReturnKeyByGetCurrVal() throws Exception {
Connection conn = getConnection()
String vsql = "insert into t1(id) values(seq_t1.nextval)"
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql)
pstmt.executeUpdate()
pstmt.close()
vsql="select seq_t1.currval as id from dual"
pstmt =(PreparedStatement)conn.prepareStatement(vsql)
ResultSet rs=pstmt.executeQuery()
rs.next()
int id=rs.getInt(1)
rs.close()
pstmt.close()
System.out.print("id:"+id)
return id
}
//方法三
//采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。
//这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。
public int insertDataReturnKeyByPlsql() throws Exception {
Connection conn = getConnection()
String vsql = "begin insert into t1(id) values(seq_t1.nextval) returning id into :1end"
CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql)
cstmt.registerOutParameter(1, Types.BIGINT)
cstmt.execute()
int id=cstmt.getInt(1)
System.out.print("id:"+id)
cstmt.close()
return id
}
//方法四
//采用PreparedStatement的getGeneratedKeys方法
//conn.prepareStatement的第二个参数可以设置GeneratedKeys的字段名列表,变量类型是一个字符串数组
//注:对Oracle数据库这里不能像其它数据库那样用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,这种语法是用来取自增类型的数据。
//Oracle没有自增类型,全部采用的是sequence实现,如果传Statement.RETURN_GENERATED_KEYS则返回的是新插入记录的ROWID,并不是我们相要的sequence值。
//这种方法的优点是性能良好,只要一次sql交互,实际上内部也是将sql转换成oracle的returning into的语法,缺点是只有Oracle10g才支持,使用较少。
public int insertDataReturnKeyByGeneratedKeys() throws Exception {
Connection conn = getConnection()
String vsql = "insert into t1(id) values(seq_t1.nextval)"
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new String[]{"ID"})
pstmt.executeUpdate()
ResultSet rs=pstmt.getGeneratedKeys()
rs.next()
int id=rs.getInt(1)
rs.close()
pstmt.close()
System.out.print("id:"+id)
return id
}
//方法五
//和方法三类似,采用oracle特有的returning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。
//最后用getReturnResultSet取到新插入的sequence值,
//这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。
public int insertDataReturnKeyByReturnInto() throws Exception {
Connection conn = getConnection()
String vsql = "insert into t1(id) values(seq_t1.nextval) returning id into :1"
OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql)
pstmt.registerReturnParameter(1, Types.BIGINT)
pstmt.executeUpdate()
ResultSet rs=pstmt.getReturnResultSet()
rs.next()
int id=rs.getInt(1)
rs.close()
pstmt.close()
System.out.print("id:"+id)
return id
}
由于SQL2000里面没有"自动编号",所以你的以"自动编号"设置的字段都会变成非空的字段,这就必须手工修改这些字段,并把他的"标示"选择"是",种子为"1",增量为"1",2,另外,ACCESS2000转换成SQL2000后,原来属性为"是/否"的字段将被转换成非空的"bit",这时候你必须修改成自己想要的属性了
ACCESS转SQL
SERVER中的一些经验
1.ACCESS的数据库中的自动编号类型在转化时,sql
server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!
2.转化时,跟日期有关的字段,SQL
SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。我遇见这种情况,用smalldatetime型时,转化失败,而用datetime型时,转化成功。
3.对此两种数据库进行 *** 作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete
*
from
user
where
id=10",而对SQL
SERVER数据库进行删除是用:"delete
user
where
id=10".
4.日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对
SQL
SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
5.在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL
SERVER数据库处理中,却不能用。
1、必须先安装Microsoft
Office
Access
2003,和SQL
Server2000。2、把旧的动网数据库备份,备份完成后,用Access
2003打开动网旧数据库,在打开时会出现一个警告,不要理会它(安全警告),按打开键,打开后按工具栏——数据库实用工具——转换数据库——转换为2002-2003格式,把数据库转换成2003格式。
2、转换完成后再用Access
2003打开,打开后按工具栏——数据库实用工具——升迁向导——新建数据库——填写SQL数据库登陆名称、密码和要新建的动网数据库(准备转成新的动网数据库),按下一步,按“
》”键,再按下一步,选取所有选项,再按下一步,选择“不对应用程序作任何改动”,再按完成。
3、打开SQL企业管理器——数据库吹礁詹判陆ǖ亩菘饬税桑慊髡飧鍪菘庖幌拢缓笤诠ぞ呃浮?/FONT>SQL脚本——常规——全部显示——编写全部对象脚本——确定(记住存放的位置)。
4、用记事本打开刚才生成的SQL脚本,在编辑栏——替换——查找内容为“smalldatetime”替换为“datetime”——替换全部;完成后再在编辑栏——替换——查找内容为“nvarchar”替换为“varcha”——替换全部,完成后保存退出。
5、打开SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后在工具栏——SQL查询分析器——文件——打开——“刚才生成的SQL脚本”——查询——执行,然后关闭窗口。
6、再回到SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后打开工具栏——数据库转换服务——导入数据——下一步——数据源“Microsoft
Access”文件名“为旧的动网数据库”——下一步——再下一步——从源数据复制表和视图——下一步——全选——下一步——立即运行——下一步——完成。
7、修改动网文件夹两个文件conn.asp和inc\const.asp。
SQL时间函数是getdata()
参考资料:网上整理,因为当初我也碰到这问题
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)