access数据库转换成SEQ数据库怎么转?有用什么软件转?

access数据库转换成SEQ数据库怎么转?有用什么软件转?,第1张

由于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()

参考资料:网上整理,因为当初我也碰到这问题

获取新插入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

}

sequence是序列号的意思,每次取的时候它会自动增加。sequence与表没有从属关系,与表一样属于用户。

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

1、Create Sequence语法

首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,CREATE SEQUENCE emp_sequence

INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数

NOMAXVALUE -- 不设置最大值

NOCYCLE -- 一直累加,不循环

CACHE 10

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回 sequence的当前值

NEXTVAL=增加sequence的值,然后返回 sequence 值

比如:

emp_sequence.CURRVAL

emp_sequence.NEXTVAL

可以使用sequence的地方:

- 不包含子查询、snapshot、VIEW的 SELECT 语句

- INSERT语句的子查询中

- NSERT语句的VALUES中

- UPDATE 的 SET中

可以看如下例子:

INSERT INTO emp VALUES

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20)

SELECT empseq.currval FROM DUAL

但是要注意的是:

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。

一次NEXTVAL会增加一次SEQUENCE的值。但是如果你在同一个条SQL语句里面针对同一个sequence使用多次NEXTVAL,其值都是一样的。

如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。

使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence

你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .

Alter sequence 的例子:

ALTER SEQUENCE emp_sequence

INCREMENT BY 10

MAXVALUE 10000

CYCLE -- 到10000后从头开始

NOCACHE

影响Sequence的初始化参数:

SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

可以很简单的Drop Sequence

DROP SEQUENCE order_seq

修改sequence参数:

拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence再create。例:

alter sequence SEQ maxvalue 9999999

alter sequence SEQ cache 10

在Sql语句中可以使用sequence的地方:

(1)不包含子查询、snapshot、VIEW的 SELECT 语句

(2)INSERT语句的子查询中

(3)INSERT语句的values中

(4)UPDATE 的 SET中

例如:

insert into student(id,name) values(seq.Nextval,'jack')

注意:

第一次NEXTVAL返回的是初始值,随后的NEXTVAL会返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则报如下错误:

ORA-08002 序列currval尚未在会话中定义。

使用一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你多次执行包含NEXTVAL的一条语句,其值就是不一样的。

删除sequence:drop sequence seq_a

当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。

SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了

cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

扩展资料:

定义Sequence:定义一个seq_test,最小值为10000,最大值为99999999999999999,从20000开始,增量的步长为1,缓存为20的循环排序Sequence。

定义方法:

create sequence seq_test

minvalue 10000

maxvalue 99999999999999999

start with 20000

increment by 1

cache 20

cycle

order

DB2的写法:

create sequence seq_test

as bigint

start with 20000

increment by 1

minvalue 10000

maxvalue 99999999999999999

cycle

cache 20

order

PostgreSQL的写法:

create sequence seq_test

increment by 1

minvalue 10000

maxvalue 99999999999999999

start 20000

cache 20

cycle

二、Oracle、DB2、PostgreSQL数据库Sequence值的引用参数为:currval、nextval,分别表示当前值和下一个值。下面分别从三个数据库的Sequence中获取nextval的值。

Oracle中:seq_test.nextval

例如:select seq_test.nextval from dual

DB2中:nextval for SEQ_TOPICMS

例如:values nextval for seq_test

PostgreSQL中:nextval(seq_test)

例如:select nextval('seq_test')

三、Sequence与indentity的区别与联系

Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。

Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。

四、postgresql中的Sequence分配策略(postgresql8.3.x)

调用select nextval(seq_test)后,系统马上分配一个序号给用户,然后系统的次Sequence马上加上之前设置的步长(increment by 1),不论此序号用户是否使用。

调用select currval(seq_test)返回当前的序列号,该序列号只要没有使用,就不会变化,直到被使用后,才会变化,并且该序列号已经分配给当前请求,不会再分配给其他的请求。

所以,减少浪费时,使用currval,不在乎浪费,而且id不连续的话,可以使用nextval。因为一旦分配给你后,使用失败,将会把该序列号丢弃!

参考资料:百度百科-sequence

参考资料:百度百科-结构化查询语言


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9958102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存