[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自己的东西,说不好,不过,我估计是假分页。
Global site tag (gtag.js) - Google Analytics