[guzz使用问题] 大概看了下,想问下对SQLSERVER支持如何?
tonyshen277
2010-05-06
大概看了下,想问下对SQLSERVER支持如何?
|
|
myreligion
2010-05-07
不支持。
基本上没有用过sql server,所以不知道如何支持(sql server中的sql语句不会写,也没有测试环境)。 对sql server的支持应该就是实现一个dialect(和1个特殊的主键自增策略?),您可以继承org.guzz.dialect.AbstractDialect实现一个。 如果您对sql server很熟悉的,也可以告诉我们sql server对于分页,sequence,uuid,行锁,以及自增ID获取方式的sql写法。我弄好了您试试。 oracle dialect的实现: public class Oracle8iDialect extends AbstractDialect { public Oracle8iDialect(){ super() ; this.registerUserDefinedTypes("Oracle.Long", new StringSQLDataType()) ; this.registerUserDefinedTypes("varchar2", new StringSQLDataType()) ; this.registerUserDefinedTypes("nclob", new ClobSQLDataType()) ; this.registerUserDefinedTypes("raw", new BytesSQLDataType()) ; } public String getLimitedString(String sql, int offset, int limit) { sql = sql.trim() ; String sql2 = sql.toLowerCase() ; boolean isForUpdate = false ; boolean isForUpdateNoWait = false ; if( sql2.endsWith(" for update") ){ sql = sql.substring(0, sql.length() - 11) ; isForUpdate = true ; }else if( sql2.endsWith(" for update nowait") ){ sql = sql.substring( 0, sql.length() - 18) ; isForUpdateNoWait = true ; } StringBuffer sb = new StringBuffer(sql.length() + 128) ; if(offset > 0){ sb.append("select * from ( select row_.*, rownum rownum_ from ( ") ; } else{ sb.append("select * from ( ") ; } sb.append(sql) ; if(offset > 0){ sb.append(" ) row_ ) where rownum_ <= ").append(limit + offset).append(" and rownum_ > ").append(offset) ; } else{ sb.append(" ) where rownum <= ").append(limit) ; } if(isForUpdate ) { sb.append( " for update" ) ; }else if(isForUpdateNoWait){ sb.append( " for update nowait" ) ; } return sb.toString() ; } public String getSelectInsertedAutoIdClause() { return null ; } public String getSelectSequenceClause(String sequenceName) { if(sequenceName == null){ throw new IdentifierGenerationException("sequence name cann't be null.") ; } StringBuffer sb = new StringBuffer(32) ; sb.append("select ").append(sequenceName).append(".nextval from dual") ; return sb.toString() ; } public String getSelectGUIDClause() { return "select rawtohex(sys_guid()) from dual"; } public boolean supportsSequence() { return true; } public String getNativeIDGenerator() { return "sequence"; } public String getForUpdateNoWaitString(String sql) { return sql + " for update nowait"; } public String getForUpdateString(String sql) { return sql + " for update"; } } |
|
tonyshen277
2010-05-07
谢谢你的回复。
SQL SERVER的分页比较麻烦,特别是SQL 2000, SQL2005还好 SQL2000的分页:最好用存储过程,否则效率不高, SELECT TOP 页大小 * FROM TableName WHERE +查询条件 AND ( ID NOT IN (SELECT TOP (页大小*(页数-1)) ID where + 查询条件 FROM TableName ORDER BY ID DESC)) ORDER BY ID DESC SQL2005: SELECT temp.* FROM (SELECT ROW_NUMBER() OVER ( ORDER BY 主键) AS Row,* FROM TableName WHERE 条件 ) temp WHERE temp.Row>= + (currentPage - 1) and temp.Row <+ (currentPage * lineSize); 这是SQL2005的分页 对于sequence SQLSERVER中没有,要自己去实现 对于UUID 数据类型为uniqueidentifier,通过newID()函数可以获取 自增ID的获取方式:select @@identity 行锁为: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM table ROWLOCK WHERE id = 1 锁表: SELECT * FROM table WITH (HOLDLOCK) 另外: SQLSERVER的LEFT JOIN语句跟ORACLE也有点不同, 特别是复杂的UPDATE 语句 |
|
myreligion
2010-05-10
处理翻页实际上是对普通sql进行改造,拼出翻页语句。sql server这种写法拼接看起来非常困难啊……
我觉得2005还有希望,2000太困难了。对于2005: 引用 SELECT ROW_NUMBER() OVER ( ORDER BY 主键) 中的“主键”是指哪个?如果是多表关联查询,主键应该是哪个表的主键?谢谢。 |
|
tonyshen277
2010-05-10
myreligion 写道 引用 SELECT ROW_NUMBER() OVER ( ORDER BY 主键)
中的“主键”是指哪个?如果是多表关联查询,主键应该是哪个表的主键?谢谢。 主键实际上是指查询时要排序的那个字段,可以是多个 |
|
myreligion
2010-05-10
tonyshen277 写道 myreligion 写道 引用 SELECT ROW_NUMBER() OVER ( ORDER BY 主键)
中的“主键”是指哪个?如果是多表关联查询,主键应该是哪个表的主键?谢谢。 主键实际上是指查询时要排序的那个字段,可以是多个 这样就更难办了。dialect我是抄hibernate的,我看了下,hibernate好像也没处理了,只让翻第一页。这样的话,翻页是支持不了的。 不知道微软自己的linq怎么分页的,估计也比较郁闷吧~~ |
|
tonyshen277
2010-05-10
MS自己的东西,说不好,不过,我估计是假分页。
|